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

13.3-dars: Koeffitsiyentlarni talqin qilish

13-QISM — REGRESSIYA · 3-dars


1. Kirish va motivatsiya

Chiziqli modelning asosiy qiymati — koeffitsiyentlar. Lekin ularni o'qish ko'rinadiganidan qiyin: koeffitsiyent kattaligi birlikka bog'liq, ishorasi boshqa belgilarga bog'liq, barqarorligi esa belgilarning o'zaro bog'liqligiga. Noto'g'ri o'qilgan koeffitsiyent noto'g'ri biznes qaroriga aylanadi.

Bu darsda: birliklar va standartlashtirilgan koeffitsiyentlar, multikollinearlik va VIF, koeffitsiyentlarning beqarorligi, log-transformatsiyalarda talqin (elastiklik, foizli o'zgarish), kategoriya koeffitsiyentlari (tayanch daraja) va koeffitsiyentdan ta'sir haqida xulosa chiqarish chegaralari.

Real vaziyat. Marketing jamoasi modeldan shunday xulosa chiqardi: "Instagram koeffitsiyenti -1.2 — u sotuvni kamaytiryapti, byudjetni olib tashlaymiz". Tekshiruv: Instagram va Facebook xarajatlari korrelyatsiyasi 0.94 edi (ular birga o'zgardi), koeffitsiyentlar esa beqaror — VIF 18. Belgilarni birlashtirgach ("umumiy ijtimoiy tarmoq byudjeti"), koeffitsiyent +2.1 bo'ldi. Kanalni yopish xato bo'lar edi.

Bu darsda koeffitsiyentlarni to'g'ri o'qishni o'rganamiz.

Bu darsda:

  • Birliklar va standartlashtirish
  • Multikollinearlik va VIF
  • Koeffitsiyent barqarorligi
  • Log-transformatsiyalarda talqin
  • Kategoriya koeffitsiyentlari
  • Ta'sir haqida xulosa chegaralari
  • Tuzoqlar
  • Amaliy: koeffitsiyentlar hisoboti

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


2. Nazariya — chuqur tushuntirish

2.1. Birliklar

text
Koeffitsiyent birligi = y birligi / x birligi

narx (ming $) ~ maydon (m^2):  w = 1.52  →  "+1 m^2 = +1.52 ming $"
maydon sm^2 da berilsa:        w = 0.000152  →  bir xil model, boshqa son!

Koeffitsiyent kattaligi MUHIMLIK emas

Koeffitsiyentni birliksiz o'qish — eng keng tarqalgan xato. w = 38 va w = 1.52 ni solishtirib "birinchisi muhimroq" deyish noto'g'ri: birinchisi 0/1 belgi, ikkinchisi m^2 uchun. Solishtirish uchun standartlashtirilgan koeffitsiyentlar kerak.

2.2. Standartlashtirilgan koeffitsiyentlar

text
x ni standartlashtiring: z = (x - o'rtacha) / SD
Keyin: w_std = w × SD_x            (y standartlashtirilmagan bo'lsa)

Talqin: "x bir SD ga o'zgarsa, y qancha o'zgaradi"
Bu — belgilarni O'ZARO solishtirish uchun yagona to'g'ri yo'l

Diqqat: 0/1 belgilar uchun SD ma'nosi cheklangan (ulushga bog'liq)

Standartlashtirilgan koeffitsiyent (w × SD_x) belgilarni bir shkalaga keltiradi: "bir SD o'zgarish qancha ta'sir beradi". Bu sklearn da StandardScaler bilan avtomatik olinadi. Lekin eslang: bu ham muhimlik emas, bog'lanish kuchi — sababiy talqin baribir asoslanmaydi 13.2-bob.

2.3. Multikollinearlik va VIF

text
Multikollinearlik — belgilar o'zaro kuchli bog'liq

Oqibatlari:
  · koeffitsiyentlar BEQAROR (namuna biroz o'zgarsa keskin o'zgaradi)
  · standart xatolar katta, p-qiymatlar yuqori
  · ishoralar mantiqqa zid bo'lishi mumkin
  · BASHORAT sifati odatda ZARAR KO'RMAYDI

VIF_j = 1 / (1 - R_j^2),  R_j^2 — x_j ni qolgan belgilarga regressiya
  VIF < 5   — muammo yo'q
  5..10     — ehtiyot
  > 10      — jiddiy

Multikollinearlik — talqin muammosi, bashorat muammosi emas. Agar sizga faqat bashorat kerak bo'lsa, uni e'tiborsiz qoldirsangiz bo'ladi; koeffitsiyentlarni tushuntirish kerak bo'lsa — hal qilish shart. VIF har belgi uchun "qolganlari uni qanchalik tushuntiradi"ni o'lchaydi.

2.4. Multikollinearlikni hal qilish

text
1. Belgilarni BIRLASHTIRISH (ikki kanal byudjeti → umumiy byudjet)
2. Birini olib tashlash (mantiqan kamroq muhimini)
3. Ridge regularizatsiyasi 13.7-bob — koeffitsiyentlarni barqarorlashtiradi
4. PCA bilan yangi ortogonal belgilar 10.9-bob — talqin yo'qoladi
5. Ko'proq ma'lumot yig'ish
6. Hech narsa qilmaslik — agar faqat bashorat kerak bo'lsa

Yechim maqsadga bog'liq: talqin kerak bo'lsa — birlashtirish yoki olib tashlash (domen bilimi bilan); barqaror koeffitsiyent kerak bo'lsa — Ridge 13.7-bob. PCA multikollinearlikni to'liq yechadi, lekin koeffitsiyentlar ma'nosini yo'qotadi — talqin talab qilinmaganda mos.

2.5. Log-transformatsiyalarda talqin

text
log(y) ~ x        →  w = "x bir birlikka oshsa, y ≈ 100·w % o'zgaradi"  (kichik w uchun)
                     aniq: (exp(w) - 1) × 100%
y ~ log(x)        →  "x 1% oshsa, y ≈ w/100 birlikka o'zgaradi"
log(y) ~ log(x)   →  w = ELASTIKLIK: "x 1% oshsa, y w% o'zgaradi"

Diqqat: log fazoda o'qitilgan modelni asl birlikka qaytarganda
        exp(bashorat) MEDIANANI beradi, o'rtachani emas (qiyshiqlik tuzatishi kerak)

Log-log modeli iqtisodda eng ko'p ishlatiladigan shakl, chunki koeffitsiyent elastiklik bo'ladi — birliksiz va tushunarli ("narx 1% oshsa, talab 1.3% kamayadi"). log(y) ishlatish, shuningdek, o'ng qiyshiq maqsad va ko'paytiruvchi xato uchun mos (12.8 MSLE).

2.6. Kategoriya koeffitsiyentlari

text
One-hot (drop_first=True): bitta daraja TAYANCH bo'ladi
  hudud: markaz (tayanch), shimol, janub, chekka
  w_shimol = "shimol markazdan qancha farq qiladi"

Tayanch darajani o'zgartirsangiz — barcha koeffitsiyentlar o'zgaradi (model bir xil!)
Tayanch: eng ko'p uchraydigan yoki eng mantiqiy daraja

Kategoriya koeffitsiyentlari har doim tayanch darajaga nisbatan o'qiladi — buni hisobotda yozmaslik keng tarqalgan xato. Model sifati tayanch tanlovidan o'zgarmaydi, faqat sonlar boshqacha ko'rinadi. Barcha darajalarni kiritish (drop_first=False) kesma bilan to'liq kollinearlikka olib keladi ("dummy variable trap").

2.7. Tuzoqlar

Asosiy tuzoqlar: koeffitsiyentlarni birliksiz solishtirish; sababiy talqin 13.2-bob; multikollinearlikda ishoraga ishonish; VIF ni tekshirmaslik; log modelida koeffitsiyentni birlik deb o'qish; kategoriya tayanch darajasini aytmaslik; p-qiymatga ko'p test tuzatishisiz ishonish 11.9-bob; koeffitsiyent noaniqligini (CI) bermaslik; ekstrapolyatsiya.

2.8. Koeffitsiyent — shartli bayonot

Koeffitsiyentni o'qishda uchta savol: (1) birligi nima — solishtirish uchun standartlashtiring (w × SD_x); (2) barqarormi — belgilar o'zaro bog'liq bo'lsa (VIF > 10) koeffitsiyent beqaror, ishorasi ham o'zgarishi mumkin, lekin bashorat zarar ko'rmaydi; (3) qanday shaklda — log(y) da foiz, log-log da elastiklik, kategoriyada tayanch darajaga nisbatan farq. Har uchala javob hisobotda bo'lishi kerak, ishonch oralig'i bilan birga. Keyingi dars — regressiya taxminlari va diagnostika.


3. Tez ma'lumotnoma

python
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# standartlashtirilgan koeffitsiyentlar
w_std = model.coef_ * X.std(axis=0, ddof=1)

# VIF
Xc = sm.add_constant(X)
vif = [variance_inflation_factor(Xc, i) for i in range(1, Xc.shape[1])]

# log talqini
# log(y) ~ x:      (np.exp(w) - 1) * 100  → foiz o'zgarish
# log(y) ~ log(x): w → elastiklik

# kategoriya
pd.get_dummies(df["hudud"], drop_first=True)      # tayanch — birinchi daraja
QOIDA: birlikni yoz · VIF tekshir · CI ber · tayanch darajani ayt · sabab dema

Talqin xulosasi

w birligi = y birligi / x birligi · solishtirish uchun w × SD_x
VIF > 10 — koeffitsiyent beqaror (bashorat emas, talqin muammosi)
log(y)~x: ~100w% · y~log(x): w/100 birlik · log-log: elastiklik
Kategoriya: tayanch darajaga nisbatan farq

4. Batafsil misollar

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

Misol 1 — Birlik va standartlashtirish

python
"""Koeffitsiyent kattaligi muhimlik emas (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression


def main() -> None:
    rng = np.random.default_rng(6)
    n = 2000
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    markaz = (rng.random(n) < 0.3).astype(float)
    yosh = rng.integers(0, 45, n).astype(float)
    narx = 18 + 1.52 * maydon + 38 * markaz - 0.62 * yosh + rng.normal(0, 13, n)
    nomlar = ["maydon", "markaz", "yosh"]
    X = np.column_stack([maydon, markaz, yosh])

    print("=== 1. Xom koeffitsiyentlar ===")
    m = LinearRegression().fit(X, narx)
    for nom, w in zip(nomlar, m.coef_):
        print(f"  {nom:<8}: {w:+8.3f}")
    print("  ('markaz eng muhim' degan xulosa — xato)")

    print("\n=== 2. Birlikni o'zgartiramiz: maydon sm^2 da ===")
    X2 = X.copy()
    X2[:, 0] = X2[:, 0] * 10_000
    m2 = LinearRegression().fit(X2, narx)
    print(f"  maydon koeffitsiyenti: {m2.coef_[0]:.8f}")
    print(f"  model bir xil: bashoratlar teng = "
          f"{np.allclose(m.predict(X), m2.predict(X2))}")

    print("\n=== 3. Standartlashtirilgan koeffitsiyentlar ===")
    sd = X.std(axis=0, ddof=1)
    for nom, w, s in zip(nomlar, m.coef_, sd):
        print(f"  {nom:<8}: w = {w:+8.3f}, SD = {s:6.2f}, "
              f"w × SD = {w * s:+7.2f}")
    print("  talqin: belgi bir SD ga o'zgarsa narx qancha o'zgaradi")

    print("\n=== 4. Tartib o'zgardi ===")
    tartib = sorted(zip(nomlar, np.abs(m.coef_ * sd)), key=lambda t: -t[1])
    print(f"  standartlashgan bo'yicha: {[n for n, _ in tartib]}")
    print(f"  xom koeffitsiyent bo'yicha: "
          f"{[n for n, _ in sorted(zip(nomlar, np.abs(m.coef_)), key=lambda t: -t[1])]}")
    print("  ⭐ Solishtirish faqat standartlashgan koeffitsiyentlar bilan")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Xom koeffitsiyentlar ===
  maydon  :   +1.527
  markaz  :  +37.905
  yosh    :   -0.635
  ('markaz eng muhim' degan xulosa — xato)

=== 2. Birlikni o'zgartiramiz: maydon sm^2 da ===
  maydon koeffitsiyenti: 0.00015270
  model bir xil: bashoratlar teng = True

=== 3. Standartlashtirilgan koeffitsiyentlar ===
  maydon  : w =   +1.527, SD =  25.15, w × SD =  +38.41
  markaz  : w =  +37.905, SD =   0.47, w × SD =  +17.63
  yosh    : w =   -0.635, SD =  13.11, w × SD =   -8.33
  talqin: belgi bir SD ga o'zgarsa narx qancha o'zgaradi

=== 4. Tartib o'zgardi ===
  standartlashgan bo'yicha: ['maydon', 'markaz', 'yosh']
  xom koeffitsiyent bo'yicha: ['markaz', 'maydon', 'yosh']
  ⭐ Solishtirish faqat standartlashgan koeffitsiyentlar bilan

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

Misol 2 — Multikollinearlik: beqaror koeffitsiyentlar

python
"""Korrelyatsiyalangan belgilar va VIF (real numpy/sklearn/statsmodels)."""

import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold, cross_val_score
from statsmodels.stats.outliers_influence import variance_inflation_factor


def yarat(seed: int, n: int = 500):
    rng = np.random.default_rng(seed)
    insta = rng.gamma(4, 250, n)
    face = 0.9 * insta + rng.normal(0, 120, n)      # juda kuchli bog'liq
    tv = rng.gamma(3, 400, n)
    sotuv = 5000 + 1.1 * (insta + face) + 0.8 * tv + rng.normal(0, 900, n)
    return np.column_stack([insta, face, tv]), sotuv


def main() -> None:
    X, y = yarat(0)
    nomlar = ["instagram", "facebook", "tv"]

    print("=== 1. Korrelyatsiya ===")
    print(f"  corr(instagram, facebook) = {np.corrcoef(X[:, 0], X[:, 1])[0, 1]:.3f}")
    print(f"  corr(instagram, tv)       = {np.corrcoef(X[:, 0], X[:, 2])[0, 1]:.3f}")

    print("\n=== 2. VIF ===")
    Xc = sm.add_constant(X)
    for i, nom in enumerate(nomlar, start=1):
        print(f"  {nom:<10}: VIF = {variance_inflation_factor(Xc, i):6.2f}")

    print("\n=== 3. Koeffitsiyentlar turli namunalarda ===")
    for seed in [0, 1, 2, 3]:
        Xs, ys = yarat(seed)
        m = LinearRegression().fit(Xs, ys)
        print(f"  namuna {seed}: instagram {m.coef_[0]:+7.3f}, "
              f"facebook {m.coef_[1]:+7.3f}, tv {m.coef_[2]:+6.3f}")
    print("  (haqiqiy ta'sir: instagram va facebook uchun 1.1, tv uchun 0.8)")

    print("\n=== 4. Bashorat zarar ko'rmaydi ===")
    cv = KFold(5, shuffle=True, random_state=0)
    r2_hammasi = cross_val_score(LinearRegression(), X, y, cv=cv, scoring="r2").mean()
    birlashgan = np.column_stack([X[:, 0] + X[:, 1], X[:, 2]])
    r2_birlashgan = cross_val_score(LinearRegression(), birlashgan, y, cv=cv,
                                    scoring="r2").mean()
    print(f"  uchta belgi bilan:  CV R^2 = {r2_hammasi:.4f}")
    print(f"  birlashtirilgan:    CV R^2 = {r2_birlashgan:.4f}")
    mb = LinearRegression().fit(birlashgan, y)
    print(f"  birlashgan koeffitsiyent: {mb.coef_[0]:.3f} (haqiqiy 1.1), "
          f"tv {mb.coef_[1]:.3f}")
    print("  ⭐ Multikollinearlik — talqin muammosi, bashorat emas")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Korrelyatsiya ===
  corr(instagram, facebook) = 0.962
  corr(instagram, tv)       = 0.028

=== 2. VIF ===
  instagram : VIF =  13.50
  facebook  : VIF =  13.51
  tv        : VIF =   1.00

=== 3. Koeffitsiyentlar turli namunalarda ===
  namuna 0: instagram  +1.185, facebook  +1.033, tv +0.762
  namuna 1: instagram  +1.046, facebook  +1.071, tv +0.784
  namuna 2: instagram  +1.087, facebook  +1.209, tv +0.890
  namuna 3: instagram  +0.654, facebook  +1.508, tv +0.764
  (haqiqiy ta'sir: instagram va facebook uchun 1.1, tv uchun 0.8)

=== 4. Bashorat zarar ko'rmaydi ===
  uchta belgi bilan:  CV R^2 = 0.6102
  birlashtirilgan:    CV R^2 = 0.6124
  birlashgan koeffitsiyent: 1.111 (haqiqiy 1.1), tv 0.762
  ⭐ Multikollinearlik — talqin muammosi, bashorat emas

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

Misol 3 — Log modellarida talqin

python
"""log(y), log(x) va log-log koeffitsiyentlari (real numpy/sklearn)."""

import numpy as np
from sklearn.linear_model import LinearRegression


def main() -> None:
    rng = np.random.default_rng(8)
    n = 4000

    print("=== 1. log(y) ~ x: foizli o'zgarish ===")
    tajriba = rng.uniform(0, 20, n)
    # har yil tajriba maoshni ~7% oshiradi (ko'paytiruvchi model)
    maosh = 400 * np.exp(0.07 * tajriba) * rng.lognormal(0, 0.18, n)
    m = LinearRegression().fit(tajriba.reshape(-1, 1), np.log(maosh))
    w = m.coef_[0]
    print(f"  koeffitsiyent = {w:.4f}")
    print(f"  taxminiy talqin: har yil +{w * 100:.2f}%")
    print(f"  aniq talqin:     har yil +{(np.exp(w) - 1) * 100:.2f}%  (haqiqiy +7.25%)")

    print("\n=== 2. y ~ log(x): kamayuvchi qaytim ===")
    reklama = rng.uniform(100, 10_000, n)
    sotuv = 2000 + 850 * np.log(reklama) + rng.normal(0, 400, n)
    m2 = LinearRegression().fit(np.log(reklama).reshape(-1, 1), sotuv)
    print(f"  koeffitsiyent = {m2.coef_[0]:.1f}")
    print(f"  talqin: reklama 1% oshsa, sotuv +{m2.coef_[0] / 100:.1f} birlik")
    print(f"  reklama 2 barobar oshsa: +{m2.coef_[0] * np.log(2):.0f} birlik")

    print("\n=== 3. log-log: elastiklik ===")
    narx = rng.uniform(5, 60, n)
    talab = 10_000 * narx ** (-1.3) * rng.lognormal(0, 0.15, n)
    m3 = LinearRegression().fit(np.log(narx).reshape(-1, 1), np.log(talab))
    print(f"  elastiklik = {m3.coef_[0]:.3f} (haqiqiy -1.3)")
    print("  talqin: narx 1% oshsa, talab "
          f"{abs(m3.coef_[0]):.2f}% kamayadi")

    print("\n=== 4. Asl birlikka qaytish tuzog'i ===")
    log_bashorat = m.predict(tajriba.reshape(-1, 1))
    oddiy = np.exp(log_bashorat)
    qoldiq_var = np.var(np.log(maosh) - log_bashorat, ddof=2)
    tuzatilgan = np.exp(log_bashorat + qoldiq_var / 2)
    print(f"  haqiqiy o'rtacha maosh:    {maosh.mean():8.2f}")
    print(f"  exp(bashorat) o'rtachasi:  {oddiy.mean():8.2f}  ← past (median beradi)")
    print(f"  qiyshiqlik tuzatilgan:     {tuzatilgan.mean():8.2f}")
    print("  ⭐ Log fazodan qaytishda tuzatish kerak")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. log(y) ~ x: foizli o'zgarish ===
  koeffitsiyent = 0.0700
  taxminiy talqin: har yil +7.00%
  aniq talqin:     har yil +7.25%  (haqiqiy +7.25%)

=== 2. y ~ log(x): kamayuvchi qaytim ===
  koeffitsiyent = 853.4
  talqin: reklama 1% oshsa, sotuv +8.5 birlik
  reklama 2 barobar oshsa: +592 birlik

=== 3. log-log: elastiklik ===
  elastiklik = -1.303 (haqiqiy -1.3)
  talqin: narx 1% oshsa, talab 1.30% kamayadi

=== 4. Asl birlikka qaytish tuzog'i ===
  haqiqiy o'rtacha maosh:      882.05
  exp(bashorat) o'rtachasi:    868.50  ← past (median beradi)
  qiyshiqlik tuzatilgan:       882.18
  ⭐ Log fazodan qaytishda tuzatish kerak

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Kategoriya koeffitsiyentlari va hisobot

python
"""Tayanch daraja va to'liq koeffitsiyentlar hisoboti (real pandas/statsmodels)."""

import numpy as np
import pandas as pd
import statsmodels.api as sm


def yarat(seed: int = 15, n: int = 1500) -> pd.DataFrame:
    rng = np.random.default_rng(seed)
    hudud = rng.choice(["markaz", "shimol", "janub", "chekka"], n,
                       p=[0.3, 0.25, 0.25, 0.2])
    maydon = rng.lognormal(np.log(70), 0.33, n).clip(28, 260)
    yosh = rng.integers(0, 45, n).astype(float)
    qosh = pd.Series(hudud).map({"markaz": 40.0, "shimol": 8.0,
                                 "janub": 0.0, "chekka": -14.0}).to_numpy()
    narx = 18 + 1.52 * maydon - 0.62 * yosh + qosh + rng.normal(0, 13, n)
    return pd.DataFrame({"hudud": hudud, "maydon": maydon, "yosh": yosh, "narx": narx})


def moslash(df: pd.DataFrame, tayanch: str):
    darajalar = [d for d in ["markaz", "shimol", "janub", "chekka"] if d != tayanch]
    X = pd.concat([df[["maydon", "yosh"]],
                   pd.DataFrame({f"hudud_{d}": (df["hudud"] == d).astype(float)
                                 for d in darajalar})], axis=1)
    return sm.OLS(df["narx"], sm.add_constant(X)).fit(), X.columns.tolist()


def main() -> None:
    df = yarat()

    print("=== 1. Tayanch = markaz ===")
    nat, ustunlar = moslash(df, "markaz")
    for nom, w, se in zip(["kesma"] + ustunlar, nat.params, nat.bse):
        print(f"  {nom:<14}: {w:+8.2f} ± {se:5.2f}")
    print("  hudud koeffitsiyentlari — MARKAZGA nisbatan")

    print("\n=== 2. Tayanch = janub ===")
    nat2, ustunlar2 = moslash(df, "janub")
    for nom, w, se in zip(["kesma"] + ustunlar2, nat2.params, nat2.bse):
        print(f"  {nom:<14}: {w:+8.2f} ± {se:5.2f}")
    print(f"  model bir xil: R^2 {nat.rsquared:.4f} va {nat2.rsquared:.4f}")

    print("\n=== 3. Farqlar saqlanadi ===")
    print(f"  markaz - shimol (1-model): {-nat.params['hudud_shimol']:+.2f}")
    print(f"  markaz - shimol (2-model): "
          f"{nat2.params['hudud_markaz'] - nat2.params['hudud_shimol']:+.2f}")

    print("\n=== 4. Hisobot ko'rinishi ===")
    ci = nat.conf_int()
    print("  Belgilar (tayanch hudud: markaz), narx ming $ da:")
    talqin = {
        "maydon": "har m^2 uchun",
        "yosh": "har yil uchun",
        "hudud_shimol": "markazga nisbatan",
        "hudud_janub": "markazga nisbatan",
        "hudud_chekka": "markazga nisbatan",
    }
    for nom in ustunlar:
        w = nat.params[nom]
        lo, hi = ci.loc[nom]
        print(f"   {nom:<14} {w:+7.2f}  [95% CI {lo:+7.2f}, {hi:+7.2f}]  "
              f"{talqin[nom]}")
    print("  ⭐ Tayanch daraja hisobotda ko'rsatilishi SHART")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Tayanch = markaz ===
  kesma         :   +59.00 ±  1.31
  maydon        :    +1.51 ±  0.01
  yosh          :    -0.63 ±  0.03
  hudud_shimol  :   -32.19 ±  0.96
  hudud_janub   :   -39.12 ±  0.91
  hudud_chekka  :   -54.53 ±  1.00
  hudud koeffitsiyentlari — MARKAZGA nisbatan

=== 2. Tayanch = janub ===
  kesma         :   +19.89 ±  1.35
  maydon        :    +1.51 ±  0.01
  yosh          :    -0.63 ±  0.03
  hudud_markaz  :   +39.12 ±  0.91
  hudud_shimol  :    +6.93 ±  0.97
  hudud_chekka  :   -15.41 ±  1.01
  model bir xil: R^2 0.9121 va 0.9121

=== 3. Farqlar saqlanadi ===
  markaz - shimol (1-model): +32.19
  markaz - shimol (2-model): +32.19

=== 4. Hisobot ko'rinishi ===
  Belgilar (tayanch hudud: markaz), narx ming $ da:
   maydon           +1.51  [95% CI   +1.48,   +1.54]  har m^2 uchun
   yosh             -0.63  [95% CI   -0.68,   -0.58]  har yil uchun
   hudud_shimol    -32.19  [95% CI  -34.07,  -30.30]  markazga nisbatan
   hudud_janub     -39.12  [95% CI  -40.91,  -37.33]  markazga nisbatan
   hudud_chekka    -54.53  [95% CI  -56.49,  -52.57]  markazga nisbatan
  ⭐ Tayanch daraja hisobotda ko'rsatilishi SHART

Nima ko'rsatdi: 2.6-bo'lim.


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

Noto'g'ri fikr To'g'risi
"Katta koeffitsiyent — muhim belgi" Birlikka bog'liq
"Manfiy ishora — zarar" Multikollinearlikda beqaror
"Multikollinearlik bashoratni buzadi" Asosan talqinni
"VIF 3 — muammo" 10 dan katta bo'lsa
"log koeffitsiyenti — birlik" Foiz yoki elastiklik
"exp(bashorat) = o'rtacha" Median
"Kategoriya koeffitsiyenti — mutlaq" Tayanchga nisbatan
"p < 0.05 — ta'sir bor" CI va ko'p testni ko'ring

6. Keng tarqalgan xatolar va yechimlari

1. Xom koeffitsiyentlarni solishtirish

python
# "markaz (38) maydondan 1.5-bob muhimroq"                          # ⚠️
w_std = m.coef_ * X.std(axis=0, ddof=1)                           # ✅

2. VIF ni tekshirmaslik

python
# koeffitsiyent ishorasidan xulosa                                # ⚠️
variance_inflation_factor(sm.add_constant(X), i)                  # ✅

3. Log koeffitsiyentini noto'g'ri o'qish

python
# "log(maosh) modeli: +0.07 so'm"                                 # ⚠️
# "+7.25% (exp(0.07) - 1)"                                        # ✅

4. Log fazodan qaytishda tuzatmaslik

python
bashorat = np.exp(model.predict(X))                               # ⚠️
bashorat = np.exp(pred + qoldiq_var / 2)                          # ✅

5. Tayanch darajani aytmaslik

python
print("shimol: +8.0")                                             # ⚠️
print("shimol: +8.0 (markazga nisbatan)")                         # ✅

6. Dummy tuzog'i

python
pd.get_dummies(df["hudud"])            # kesma bilan kollinear    # ⚠️
pd.get_dummies(df["hudud"], drop_first=True)                      # ✅

7. Noaniqliksiz hisobot

python
print(f"maydon: {w:.2f}")                                         # ⚠️
print(f"maydon: {w:.2f} [CI {lo:.2f}, {hi:.2f}]")                 # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 4.9-dars (o'tilgan): Korrelyatsiya
  • 10.9-dars (o'tilgan): PCA — ortogonal belgilar
  • 13.2-dars (o'tilgan): Nazoratga olish
  • 13.7-dars: Ridge — barqaror koeffitsiyentlar
  • 13.9-dars: Kategoriyalar va o'zaro ta'sirlar

8. Eng yaxshi amaliyotlar

  1. Birlikni yozing.

  2. Solishtirish uchun standartlashtiring.

  3. VIF ni tekshiring.

  4. Ishonch oralig'ini bering.

  5. Tayanch darajani ko'rsating.

  6. Log talqinini aniq yozing.

  7. Sababiy tildan saqlaning.

  8. Beqarorlikni tekshiring (turli namunalar).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # koeffitsiyent birligi?
2.  # standartlashtirilgan koeffitsiyent formulasi?
3.  # multikollinearlik nimaga zarar qiladi?
4.  # VIF formulasi?
5.  # VIF chegarasi?
6.  # log(y) ~ x talqini?
7.  # log-log talqini?
8.  # y ~ log(x) talqini?
9.  # exp(bashorat) nimani beradi?
10. # kategoriya koeffitsiyenti nimaga nisbatan?
11. # dummy tuzog'i nima?
12. # multikollinearlikni qanday hal qilish mumkin?
Javoblar
  1. y birligi / x birligi
  2. w × SD_x
  3. Talqinga (koeffitsiyent beqaror)
  4. 1/(1-R_j^2)
  5. 10
  6. Foizli o'zgarish
  7. Elastiklik
  8. 1% oshsa w/100 birlik
  9. Median
  10. Tayanch darajaga
  11. Barcha darajalar + kesma
  12. Birlashtirish, olib tashlash, Ridge, PCA

Vazifa 2: Xatolarni tuzating

python
1.  # "markaz koeffitsiyenti 38 — eng muhim belgi"

2.  # VIF 22 bo'lgan belgi koeffitsiyentidan xulosa

3.  # "log(narx) modeli: +0.12 ming so'm"

4.  bashorat = np.exp(model.predict(X))

5.  print("shimol: +8.0")
Javoblar
python
1.  w_std = m.coef_ * X.std(axis=0, ddof=1)

2.  # belgilarni birlashtiring yoki Ridge ishlating

3.  # "+12.7% (exp(0.12) - 1)"

4.  bashorat = np.exp(pred + s2 / 2)

5.  print("shimol: +8.0 (markazga nisbatan)")

Vazifa 3: Standartlashtirish

Modellang:

  1. Turli birlikli belgilar
  2. Xom va standartlashgan koeffitsiyentlar
  3. Tartib farqi
  4. Hisobot

Vazifa 4: Multikollinearlik

Modellang:

  1. Korrelyatsiyalangan belgilar
  2. VIF
  3. Namunalar bo'yicha beqarorlik
  4. Yechim

Vazifa 5: Log modellari

Modellang:

  1. Uch shakl
  2. Talqin
  3. Qiyshiqlik tuzatishi
  4. Xulosa

Vazifa 6: Kategoriyalar

Modellang:

  1. Ikki tayanch
  2. Koeffitsiyentlar
  3. Farqlar tengligi
  4. Hisobot

Vazifa 7: O'ylash

Regressiya koeffitsiyentlari ko'pincha "belgi muhimligi" sifatida taqdim etiladi va shu asosda resurslar taqsimlanadi. Bu yondashuvning chegaralari qanday va muhimlikni qanday o'lchash to'g'riroq?

Javob

Qisqa javob: koeffitsiyent — "muhimlik" emas, shartli bog'lanish kuchi. Resurs taqsimlash uchun kerak bo'lgani — o'zgartirish natijasi (ta'sir), uni esa faqat tajriba yoki sababiy usul beradi.

1. Koeffitsiyent nimani bermaydi

Savol Koeffitsiyent javob beradimi
Qaysi belgi y bilan kuchli bog'liq Qisman (standartlashtirilsa)
Qaysi belgi bashoratga ko'p hissa qo'shadi Yo'q (permutation importance yaxshiroq)
Belgini o'zgartirsak nima bo'ladi Yo'q (tajriba kerak)
Byudjetni qayerga yo'naltirish Yo'q

2. Muqobil o'lchovlar

  • Permutation importance: belgi aralashtirilsa metrika qancha tushadi
  • SHAP: har bashoratga hissa (modelga xos emas)
  • Ablatsiya: belgini olib tashlab CV ni qayta o'lchash
  • Tajriba: haqiqiy ta'sir (11.10)

3. Nega ular ham yetarli emas

  • Hammasi bashorat haqida gapiradi, ta'sir haqida emas
  • Korrelyatsiyalangan belgilarda muhimlik "bo'linib ketadi"
  • Ma'lumot taqsimoti o'zgarsa natija ham o'zgaradi

4. Amaliy tartib

  1. Standartlashtirilgan koeffitsiyent + CI — birinchi qarash
  2. Permutation importance — bashorat hissasi
  3. Domen bilimi bilan tekshirish
  4. Qaror uchun — tajriba

5. Xulosa

  1. Koeffitsiyent — shartli bog'lanish
  2. Muhimlik ta'rifi savolga bog'liq
  3. Bir nechta o'lchovni birga ko'ring
  4. Qaror uchun tajriba kerak

Nimani mustahkamlaydi: 2.1, 2.3-bo'limlar.


Xulosa

Bu darsda koeffitsiyentlarni talqin qilishni o'rgandik.

Eng muhim uch fikr:

  1. Koeffitsiyent birlikka bog'liq. w = 38 va w = 1.52 ni to'g'ridan-to'g'ri solishtirish xato: birlikni o'zgartirsangiz son o'zgaradi, model esa o'zgarmaydi. Solishtirish uchun standartlashtirilgan koeffitsiyent (w × SD_x) — "belgi bir SD ga o'zgarsa, y qancha o'zgaradi".

  2. Multikollinearlik talqinni buzadi. Belgilar o'zaro kuchli bog'liq bo'lsa (VIF > 10) koeffitsiyentlar beqaror bo'ladi — namuna biroz o'zgarsa qiymat, hatto ishora ham o'zgaradi. Muhim nuans: bashorat sifati zarar ko'rmaydi. Yechim maqsadga bog'liq: belgilarni birlashtirish, birini olib tashlash yoki Ridge 13.7-bob.

  3. Shakl talqinni o'zgartiradi. log(y) ~ x da koeffitsiyent foizli o'zgarish ((e^w - 1)×100%), log-log da elastiklik, y ~ log(x) da "1% oshsa w/100 birlik". Log fazodan qaytishda exp(bashorat) medianani beradi. Kategoriya koeffitsiyentlari esa tayanch darajaga nisbatan — buni hisobotda yozish shart.

Keyingi darsda regressiya taxminlari va diagnostikani o'rganamiz: chiziqlilik, mustaqillik, geteroskedastiklik, normal qoldiqlar, ta'sirli nuqtalar va nima qilish kerakligi.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
13.3-dars: Koeffitsiyentlarni talqin qilish — IlmHamroh