Asosiy qismga o'tish

Regression plot lar

19-bob 24 kod bloki 6589 so'z

Seaborn da ikkita numeric o'zgaruvchi o'rtasidagi bog'liqlikni fit qilingan trend bilan birga ko'rsatadigan uchta maxsus function bor: sns.regplot(), sns.lmplot() va sns.residplot(). Ularning asosiy ishi bir xil — orqa fonda model ni fit qiladi va natijani scatter ustiga chizadi — lekin qamrovi va sizga beradigan nazorat darajasi bilan farq qiladi.

Hammasidan oldin, butun bob davomida yodingizda turishi kerak bo'lgan bitta jumla:

ASOSIY G'OYASeaborn ning regression plot lari diagnostic rasmlar, statistik hisobot emas. Ular model ni fit qiladi va chizadi, ammo hech qanday slope, intercept, p-value yoki R² qaytarmaydi. Sonlar kerak bo'lsa, ularni alohida hisoblang.

Bu kamchilik emas. Bu — mehnat taqsimoti. Seaborn "bu bog'liqlik linear ko'rinadimi va u qanchalik shovqinli?" degan savolga javob beradi — statsmodels, scipy yoki scikit-learn esa "model aniq qanday va har bir coefficient ga qanchalik ishonaman?" degan savolga javob beradi.

Bu bob davomida to'rtta built-in dataset dan foydalanamiz:

python11 qator
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="whitegrid")

tips     = sns.load_dataset("tips")       # bill va tip, continuous x va y
penguins = sns.load_dataset("penguins")   # tana o'lchovlari, toza group strukturasi
titanic  = sns.load_dataset("titanic")    # logistic fit lar uchun binary natija
anscombe = sns.load_dataset("anscombe")   # mashhur to'rtta dataset ogohlantirishi

19.1 regplot() va soyalangan band nimani anglatadi

sns.regplot() — axes-level function. U bitta Matplotlib Axes ichiga ikkita narsani chizadi:

  1. xom kuzatuvlarning scatter i;
  2. atrofida soyalangan band bo'lgan fit qilingan chiziq.
python2 qator
sns.regplot(data=tips, x="total_bill", y="tip")
plt.show()

Soyalangan band — chiziqning o‘zi uchun 95% confidence interval, ya’ni o‘rtacha bog‘lanish qanchalik noaniqligi. Bu alohida nuqtalar uchun prediction interval emas — shuning uchun nuqtalarning ko‘pi undan tashqarida qoladi.

Default holatda model ordinary least squares bo'ladi: nuqtalar bilan chiziq orasidagi vertikal masofalar kvadratlari yig'indisini minimallashtiradigan to'g'ri chiziq y = a + b*x. Band esa bootstrapping orqali chiziladi — seaborn qatorlarni ko'p marta qayta tanlaydi, har bir tanlovda chiziqni qaytadan fit qiladi va fit qilingan chiziqlarning o'rtadagi 95% ini ko'rsatadi.

Band — chiziq uchun confidence interval, nuqtalar uchun emas

Bu butun seaborn kutubxonasida eng ko'p noto'g'ri o'qiladigan element. Talabalar tor band ga qarab "model tip ni ±0.2 dollar aniqlikda bashorat qiladi" degan xulosaga keladi. Bu noto'g'ri.

Talqin To'g'rimi? Nima uchun
Har bir x da y ning o'rtacha qiymati uchun 95% confidence interval Ha Seaborn aynan shuni chizadi
Bitta yangi kuzatuv uchun prediction interval Yo'q Prediction interval ancha kengroq; u residual shovqinni ham o'z ichiga olishi shart, CI esa buni hisobga olmaydi
O'sha x dagi y ning standard deviation i Yo'q Nuqtalarning tarqoqligi band da emas, scatter ning o'zida ko'rinadi
Model qanchalik yaxshi ekanining o'lchovi Yo'q Model butunlay noto'g'ri bo'lsa ham, n o'sgani sari band torayaveradi
⚠️ Tor band yaxshi model degani emas

Band ning kengligi taxminan 1/√n ga proporsional. 50 000 qator bilan haqiqiy bog'liqlik parabola bo'lsa va sizning to'g'ri chizig'ingiz uni butunlay o'tkazib yuborsa ham, band ingichka chiziqqa aylanadi. Tor band = "o'rtacha chiziq qayerdaligini bilaman"; u "o'rtacha chiziqning shakli to'g'ri" degani haqida hech nima demaydi.

🧩 Analogiya

Har bir kurs talabalarining o'rtacha bo'yini o'lchayapsiz deb tasavvur qiling. Har kursda 1000 tadan talaba bo'lsa, har bir group ning o'rtacha bo'yini juda aniq bilasiz — o'sha aniqlik band dir. Bu har bir talabaning bo'yi shunday degani emas. Alohida talabalar hamon 15 sm gacha farq qiladi — o'sha farq scatter buluti dir. Band sizning o'rtacha haqidagi bilimingizni tavsiflaydi, alohida shaxslarning tarqoqligini emas.

Band ni boshqarish

python8 qator
# band ni butunlay o'chirish — tezroq va zich plot larda kamroq chalg'ituvchi
sns.regplot(data=tips, x="total_bill", y="tip", ci=None)

# boshqa confidence level dan foydalanish
sns.regplot(data=tips, x="total_bill", y="tip", ci=68)

# bootstrap sonini boshqarish (default 1000); kamrog'i tezroq, lekin shovqinliroq
sns.regplot(data=tips, x="total_bill", y="tip", n_boot=200)

Ikkita qatlamni alohida styling qilish

regplot() scatter va chiziqni chizadi, shuning uchun u ostidagi Matplotlib chaqiruvlariga uzatiladigan ikkita keyword argument dictionary sini qabul qiladi:

python5 qator
sns.regplot(
    data=tips, x="total_bill", y="tip",
    scatter_kws={"alpha": 0.4, "s": 25, "color": "#7a7a7a"},
    line_kws={"color": "crimson", "linewidth": 2},
)
💡 Alpha — sizning do'stingiz

Bir necha yuzdan ortiq nuqta bo'lsa, scatter yaxlit dog'ga aylanadi va chiziq kontekstini yo'qotadi. scatter_kws={"alpha": 0.3} qo'ying, shunda zichlik ko'rinadi: to'q joylar ko'p ustma-ust tushgan kuzatuvlarni bildiradi.

Axes-level bo'lgani uchun u boshqalar bilan birlashadi

python8 qator
fig, axes = plt.subplots(1, 2, figsize=(10, 4), sharey=True)

sns.regplot(data=tips, x="total_bill", y="tip", ax=axes[0])
sns.regplot(data=tips, x="size",       y="tip", ax=axes[1])

axes[0].set_title("Tip vs bill")
axes[1].set_title("Tip vs party size")
fig.tight_layout()

Shuningdek regplot() ni bir xil Axes ichida boshqa seaborn yoki Matplotlib chaqiruvi ustiga qo'yishingiz mumkin — masalan KDE fon yoki filtrlangan subset dan olingan ikkinchi regression chizig'i.

19.2 lmplot() va regplot bilan lmplot farqi

sns.lmplot() — figure-level muqobil. Ichkarida u har bir facet uchun bir marta regplot() ni chaqiradi, lekin butun figure ga egalik qiladi va FacetGrid qaytaradi.

python3 qator
g = sns.lmplot(data=tips, x="total_bill", y="tip")
print(type(g))          # seaborn.axisgrid.FacetGrid
g.set_axis_labels("Total bill ($)", "Tip ($)")
Chiqish
<class 'seaborn.axisgrid.FacetGrid'>

lmplot figure-level, shuning uchun har bir hue guruhi uchun alohida chiziq moslay oladi va col bilan panellarga bo‘la oladi. regplot ikkalasini ham qila olmaydi.

Bu ikki function deyarli barcha statistik argument larni baham ko'radi — ci, order, logistic, lowess, robust, x_estimator, x_bins, truncate. Farq — figure ni kim boshqarishida.

Jihat regplot() lmplot()
Level Axes-level Figure-level
Qaytaradi Matplotlib Axes FacetGrid
ax= ni qabul qiladi Ha Yo'q — TypeError beradi
col= / row= bilan faceting Yo'q Ha
hue= v0.12+ da qo'llab-quvvatlanadi (undan oldin yo'q edi) Ha, ancha oldindan
O'lcham nazorati plt.subplots(figsize=...) orqali height= va aspect= orqali
Legend Standart Matplotlib legend Grid tomonidan axes tashqarisiga joylanadi
Ma'lumot kirishi Vector larni yoki DataFrame ni qabul qiladi Column nomlari bilan long-form data= talab qiladi
Qachon ishlatiladi Fit ni kattaroq tuzilgan figure ichiga joylashda Bir xil fit ni subgroup lar bo'ylab solishtirishda
⚠️ `lmplot(..., ax=ax)` — bu xato

TypeError: lmplot() got an unexpected keyword argument 'ax'. Figure-level function lar o'z dizayni bo'yicha o'zining figure ini yaratadi; ularni siz allaqachon yaratgan figure ichiga joylab bo'lmaydi. O'zingiz qurgan subplot grid ichida regression kerak bo'lsa, regplot() dan foydalaning. Bu displot/histplot va catplot/boxplot da ko'rgan pattern ning aynan o'zi.

python3 qator
# figure-level o'lcham: height har bir facet uchun, dyuymda; width = height * aspect
sns.lmplot(data=tips, x="total_bill", y="tip", col="time",
           height=4, aspect=1.1)

FacetGrid ostidagi Axes ga yetib borish

python8 qator
g = sns.lmplot(data=tips, x="total_bill", y="tip", col="time")

g.axes            # Axes lardan iborat 2 o'lchamli numpy array
g.axes.flat[0]    # birinchi Axes obyekti
g.figure          # Matplotlib Figure (v0.11.2+; g.fig — eski nomi)

for ax in g.axes.flat:
    ax.axhline(3, color="grey", linestyle="--", linewidth=1)

19.3 Model variant lari: order=, logistic=, lowess=, robust=, x_estimator=

Default — to'g'ri OLS chizig'i, lekin xuddi shu function lar bir nechta boshqa model larni ham fit qila oladi. order, logistic, lowess va robust dan bir vaqtning o'zida faqat bittasi faol bo'lishi mumkin.

Argument Model statsmodels kerakmi Qachon ishlatiladi
order=2, order=3 Polynomial least squares Yo'q (numpy dan foydalanadi) Bulut ko'zga tashlanadigan darajada egri va sizga parametrik egri chiziq kerak
lowess=True Locally weighted scatterplot smoothing Ha Shaklni uning formasi haqida hech qanday taxminsiz ko'rmoqchisiz
robust=True Robust linear model (Huber turidagi vazn kamaytirish) Ha Bir nechta ekstremal nuqta OLS chizig'ini tortib yuboryapti
logistic=True Logistic regression Ha y binary 0/1
x_estimator=np.mean Baribir linear, lekin scatter siqiladi Yo'q x kam sonli diskret qiymat oladi
x_bins=8 Baribir linear, ko'rsatish uchun x bin larga guruhlanadi Yo'q Continuous x, juda shovqinli y

order= bilan polynomial fit lar

python8 qator
# ikkinchi Anscombe dataset i — shovqinsiz nuqtalardan iborat mukammal parabola
d2 = anscombe.query("dataset == 'II'")

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.regplot(data=d2, x="x", y="y", ci=None, ax=axes[0])
sns.regplot(data=d2, x="x", y="y", order=2, ci=None, ax=axes[1])
axes[0].set_title("order=1 (default) — wrong shape")
axes[1].set_title("order=2 — fits perfectly")

Binar natijada logistic=True to‘g‘ri chiziq o‘rniga S shaklidagi ehtimollik egri chizig‘ini moslaydi. Xom nuqtalar faqat 0 yoki 1 da tura oladi; egri chiziq esa ular orasidagi ehtimollikni beradi.

⚠️ Kichik namunada yuqori `order` — overfitting teatri

k darajali polynomial k+1 ta nuqtadan aniq o'ta oladi. 11 ta qator bilan order=5 juda zich ko'ringan, lekin hech nimani bashorat qilmaydigan to'lqinsimon egri chiziq beradi. Ko'proq daraja uchun fizik asos bo'lmasa, order=2 da qoling, va faqat shaklni ko'rish niyatingiz bo'lsa lowess=True ni afzal biling.

lowess=True bilan non-parametric shakl

python2 qator
sns.regplot(data=tips, x="total_bill", y="tip",
            lowess=True, line_kws={"color": "crimson"})

LOWESS ko'plab mayda lokal regression larni fit qiladi va ularni bir-biriga ulaydi. U global forma haqida hech nima taxmin qilmaydi, shuning uchun bog'liqlikka birinchi halol qarash shu. Ikkita ogohlantirish: seaborn lowess fit lari uchun confidence band chizmaydi (ci argument e'tiborga olinmaydi), va egri chiziq nuqtalar kam bo'lgan chekkalarda adashib ketishi mumkin.

robust=True bilan outlier larning vaznini kamaytirish

python8 qator
# Anscombe III: bitta outlier OLS chizig'ini haqiqiy trend dan chetga tortadi
d3 = anscombe.query("dataset == 'III'")

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.regplot(data=d3, x="x", y="y", ci=None, ax=axes[0])
sns.regplot(data=d3, x="x", y="y", robust=True, ci=None, ax=axes[1])
axes[0].set_title("OLS — pulled up by one point")
axes[1].set_title("robust=True — follows the other ten")

Robust fitting sezilarli darajada sekin, chunki band uchun bootstrap robust model ni 1000 marta qaytadan fit qiladi. O'rganish jarayonida ci=None bering yoki n_boot ni kamaytiring.

logistic=True bilan binary natijalar

y 0/1 bo'lganda to'g'ri chiziq ma'nosiz — u 0 dan past va 1 dan yuqori qiymatlarni bashorat qiladi. Logistic regression P(y = 1 | x) sifatida talqin qilinadigan S shaklidagi egri chiziqni fit qiladi.

python7 qator
sns.lmplot(
    data=titanic, x="age", y="survived",
    logistic=True, ci=95,
    height=4.5, aspect=1.3,
    y_jitter=0.03,
    scatter_kws={"alpha": 0.3},
)

Ikkita amaliy tafsilot:

  • y numeric 0/1 bo'lishi kerak, "yes"/"no" string lari emas. titanic["survived"] allaqachon 0/1; alive kabi column uchun (titanic["alive"] == "yes").astype(int) kerak bo'lardi.
  • y_jitter= (va x_jitter=) chizilgan nuqtalarni bir oz siljitadi, shunda 0 lar va 1 lardan iborat ikkita gorizontal chiziq o'z zichligini ko'rsatadi. Jitter faqat ko'rinishga ta'sir qiladi — fit asl qiymatlardan foydalanadi.
📌 Logistic fit lar sekin

Har bir bootstrap takrori logistic regression ni qaytadan fit qiladi. Bir necha ming qatorda bu normal; 100 000 qatorda esa u qotib qoladi. ci=None ishlating, yoki n_boot ni kamaytiring, yoki model ni statsmodels da bir marta fit qilib, bashorat qilingan egri chiziqni o'zingiz chizing.

Diskret yoki juda shovqinli x: x_estimator va x_bins

x faqat bir nechta alohida qiymatga ega bo'lganda — tips["size"] 1 dan 6 gacha qiymat oladi — scatter vertikal chiziqlar to'plamiga aylanadi va ko'z trend ni baholay olmaydi. x_estimator har bir chiziqni umumlashtiruvchi nuqta va error bar bilan almashtiradi:

sns.regplot(data=tips, x="size", y="tip", x_estimator=np.mean)

Bu yerdagi error bar lar estimator (ya'ni o'rtacha) ning bootstrap confidence interval lari bo'lib, xuddi shu ci argument bilan boshqariladi. Eng muhimi, regression baribir xom kuzatuvlar asosida fit qilinadi, siqilgan o'rtachalar asosida emas — faqat ko'rinish o'zgaradi.

Continuous, lekin shovqinli x uchun x_bins avval x ni group larga bo'ladi:

python5 qator
# teng sonli 8 ta bin; chiziq baribir barcha xom nuqtalar asosida fit qilinadi
sns.regplot(data=tips, x="total_bill", y="tip", x_bins=8)

# yoki bin markazlarini aniq ko'rsating
sns.regplot(data=tips, x="total_bill", y="tip", x_bins=[10, 20, 30, 40, 50])

Boshqa foydali argument lar

ArgumentTa'siri

truncate=True (default)Chiziq butun o'q bo'ylab cho'zilmasdan, ma'lumot diapazonida to'xtaydi fit_reg=FalseFaqat scatter chiziladi — lmplot ni facet langan scatterplot ga aylantiradi scatter=FalseFaqat chiziq va band chiziladi — bir nechta fit ni ustma-ust qo'yishda foydali marker= / markers=Nuqta shakli; markers=["o", "x"] bosma nashrda hue darajalarini ajratadi seed=Bootstrap RNG ni qat'iylashtiradi, shunda band takrorlanuvchan bo'ladi logx=True``y = a + b*log(x) ni fit qiladi; x musbat bo'lishi shart

Haqiqiy sonlarni olish

Yuqoridagilarning hech biri coefficient qaytarmaydi. Ularni olishning uchta standart yo'li:

python16 qator
from scipy import stats
import statsmodels.api as sm

d = tips.dropna(subset=["total_bill", "tip"])

# 1. numpy — faqat coefficient lar, avval eng yuqori daraja
slope, intercept = np.polyfit(d["total_bill"], d["tip"], deg=1)

# 2. scipy — slope, intercept, r, p-value, standard error
res = stats.linregress(d["total_bill"], d["tip"])
print(res.slope, res.intercept, res.rvalue ** 2, res.pvalue)

# 3. statsmodels — hisobotga qo'yadigan to'liq jadval
X = sm.add_constant(d["total_bill"])
model = sm.OLS(d["tip"], X).fit()
print(model.summary())
Chiqish
0.1050245173843534 0.9202696135546726 0.4566165863516758 6.692470646864404e-34
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    tip   R-squared:                       0.457
Model:                            OLS   Adj. R-squared:                  0.454
Method:                 Least Squares   F-statistic:                     203.4
Date:                Wed, 30 Sep 2026   Prob (F-statistic):           6.69e-34
Time:                        12:32:14   Log-Likelihood:                -350.54
No. Observations:                 244   AIC:                             705.1
Df Residuals:                     242   BIC:                             712.1
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.9203      0.160      5.761      0.000       0.606       1.235
total_bill     0.1050      0.007     14.260      0.000       0.091       0.120
==============================================================================
Omnibus:                       20.185   Durbin-Watson:                   2.151
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               37.750
Skew:                           0.443   Prob(JB):                     6.35e-09
Kurtosis:                       4.711   Cond. No.                         53.0
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
💡 Professional workflow

Avval seaborn bilan chizing — shaklni tekshirish va outlier larni topish uchun, keyin sonlarni e'lon qilish uchun statsmodels bilan fit qiling, so'ng o'sha fit qilingan model ning residual larini chizib uni tasdiqlang. Seaborn halqani ochadi va yopadi; statsmodels o'rtasini bajaradi.

O'zingiz fit qilgan model ni ustiga qo'yish

python7 qator
xs = np.linspace(d["total_bill"].min(), d["total_bill"].max(), 200)
ys = intercept + slope * xs

ax = sns.scatterplot(data=d, x="total_bill", y="tip", alpha=0.4)
ax.plot(xs, ys, color="crimson", linewidth=2,
        label=f"y = {intercept:.2f} + {slope:.3f}x")
ax.legend()

Fit takrorlanuvchan, hisobotga yaroqli yoki modellashtirish kodi bilan birga ulashiladigan bo'lishi kerak bo'lganda aynan shu pattern dan foydalaning — shunda grafikdagi chiziq matnda yozganingiz bilan bir xil chiziq ekani isbotlanadi.

19.4 residplot() va residual larni o'qish

Residual — model o'tkazib yuborgan narsa: residual = kuzatilgan y − bashorat qilingan y. sns.residplot() regression ni fit qiladi, uni ayiradi va qolgan qismini x ga qarshi chizadi.

python2 qator
sns.residplot(data=tips, x="total_bill", y="tip")
plt.axhline(0, color="grey", linestyle="--")

Residual lar nol atrofidagi shaklsiz bulut bo‘lishi kerak. Egrilik model shakli noto‘g‘ri ekanini bildiradi; kengayib boruvchi voronka esa dispersiya x bilan o‘sayotganini va confidence interval larga ishonib bo‘lmasligini bildiradi.

U axes-level (ax= ni qabul qiladi), va order=, robust= hamda lowess= ni qo'llab-quvvatlaydi — oxirgisi residual lar orqali smoother qo'shadi, bu esa qolib ketgan strukturani ko'rishni ancha osonlashtiradi:

python2 qator
sns.residplot(data=tips, x="total_bill", y="tip",
              lowess=True, line_kws={"color": "crimson"})
📌 Nima uchun residual lar fit dan ko'ra ma'lumotliroq

Asl scatter da kuchli trend ko'zingizni band qiladi va kichik tizimli xatolarni yashiradi. Trend ni ayirish o'sha hukmronlikni yo'qotadi va y o'qini xatolar o'lchamiga moslab qayta shkalalaydi, natijada 10 birlik slope yonida ko'rinmas bo'lgan 0.3 birlik egrilik yaqqol seziladi.

Sog'lom residual plot qanday ko'rinadi

Shaklsiz bulut, nolga nisbatan simmetrik, butun diapazon bo'ylab taxminan bir xil vertikal tarqoqlik bilan:

+2 | . . . . | . . . . . . . . 0 |------.---.-.----.---.------ | . . . . . . . -2 | . . . . +--------------------------- x YAXSHI: trend yo'q, tarqoqlik bir xil

Pattern 1 — egrilik (yetishmayotgan non-linear had)

+2 | . . | . . 0 |------.------.-------------- | . . -2 | . +--------------------------- x YOMON: tabassum/qovoq shakli. To'g'ri chiziq chekkalarda juda past, o'rtada esa juda baland. order=2, log(x) yoki sqrt(y) ni sinab ko'ring.

Pattern 2 — voronka / konus (heteroscedasticity)

+4 | . | . . . 0 |---.--.--.----.-----.------- | . . . -4 | . . +--------------------------- x YOMON: tarqoqlik x bilan o'sadi. Chiziq bir tomonlama bo'lmasligi mumkin, lekin standard error lar va CI band noto'g'ri. log(y), sqrt(y) yoki robust standard error larni sinang.

Pattern 3 — outlier lar

+8 *
0 --.-.--.-.--.--.-.--.-.-----
-8 *
+--------------------------- x
YOMON: bir yoki ikkita nuqta
qolganlarning band idan uzoqda.
Ularni alohida tekshiring —
ma'lumot xatosimi, boshqa
populyatsiyami, yoki haqiqiy
lekin kam uchraydigan holatmi?

Pattern 4 — residual lardagi trend

Agar residual lar x bo'ylab yuqoriga yoki pastga qiyalasa, fit siz o'ylagan ma'lumotning least-squares fit i emas — odatda bu bitta model ning residual larini boshqa x ga qarshi chizganingizni yoki group o'zgaruvchisi e'tiborga olinmaganini bildiradi. To'g'ri fit qilingan oddiy OLS uchun residual lar qurilishi bo'yicha x bilan korrelyatsiyalanmagan bo'ladi, shuning uchun ko'zga tashlanadigan qiyalik doim sozlashda nimadir noto'g'ri ekanini anglatadi.

⚠️ `residplot` ham residual larni qaytarmaydi

Qoida avvalgidek: siz rasm olasiz, array emas. Sonlar kerak bo'lsa, statsmodels bilan fit qiling va model.resid ni o'qing, yoki y - (intercept + slope * x) ni o'zingiz hisoblang. Rasm diagnostika uchun; array esa Breusch-Pagan yoki Durbin-Watson kabi test lar uchun.

python8 qator
model = sm.OLS(d["tip"], sm.add_constant(d["total_bill"])).fit()
resid = model.resid            # haqiqiy pandas Series
fitted = model.fittedvalues

# residual lar fitted qiymatlarga qarshi — standart diagnostika, x ga qarshi emas
ax = sns.scatterplot(x=fitted, y=resid, alpha=0.4)
ax.axhline(0, color="grey", linestyle="--")
ax.set(xlabel="Fitted values", ylabel="Residuals")

19.5 Har bir group uchun alohida chiziq fit qilish

Bitta global chiziq ko'pincha noto'g'ri xulosa bo'ladi, chunki populyatsiya group lar aralashmasidan iborat. Seaborn bo'lishning uchta yo'lini beradi.

hue= — bitta Axes da bir nechta chiziq

python2 qator
sns.lmplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
           hue="species", height=5, aspect=1.2)

Bu Simpson paradoksining penguins versiyasi va uni bir marta hue bilan, bir marta hue siz ishga tushirishga arziydi. Barcha penguin lar birga olinganda, uzunroq tumshuq sayozroq tumshuq bilan birga keladi — aniq manfiy slope. Har bir species ichida esa uzunroq tumshuq chuqurroq tumshuq bilan birga keladi — uchta aniq musbat slope. Umumlashtirilgan chiziq species lar orasidagi farqni tavsiflaydi (Gentoo lar uzun va sayoz tumshuqli), ularning birortasi ichidagi bog'liqlikni emas.

python12 qator
# bu ikkalasini yonma-yon ishga tushiring va slope belgilarini solishtiring
fig, axes = plt.subplots(1, 2, figsize=(11, 4.5), sharex=True, sharey=True)

sns.regplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
            ax=axes[0], scatter_kws={"alpha": 0.4})
axes[0].set_title("Pooled: negative slope")

for sp, sub in penguins.groupby("species"):
    sns.regplot(data=sub, x="bill_length_mm", y="bill_depth_mm",
                ax=axes[1], label=sp, scatter_kws={"alpha": 0.4})
axes[1].legend(title="species")
axes[1].set_title("By species: three positive slopes")
🧩 Analogiya

Group lar bo'ylab o'rtachalash — mehmonxonaning o'rtacha haroratini har bir xonaning issiq va sovuq jo'mraklaridan olingan suvni aralashtirib o'lchashga o'xshaydi. Aralashma sizga birorta jo'mrak issiq yoki sovuq oqishi haqida hech nima aytmaydi — hatto har bir xonada sodir bo'layotganning aksini ko'rsatishi ham mumkin.

col= va row= — har bir group uchun bitta panel

python8 qator
# lunch/dinner uchun bittadan column
sns.lmplot(data=tips, x="total_bill", y="tip", col="time", height=4)

# to'liq grid: qatorlar = smoker, ustunlar = time, ranglar = sex
sns.lmplot(data=tips, x="total_bill", y="tip",
           row="smoker", col="time", hue="sex",
           height=3.5, aspect=1.1, ci=None,
           scatter_kws={"alpha": 0.5})

Group lar bir-birining ustiga kuchli tushganda faceting hue dan yaxshiroq — alohida panellar spagetti laganidan qutqaradi. Slope larni bevosita solishtirish kerak bo'lganda esa hue yaxshiroq, chunki burchaklarni panellar bo'ylab solishtirish ularni yonma-yon solishtirishdan qiyinroq.

💡 Slope larni solishtirganda o'qlarni umumiy qoldiring

lmplot default holatda x va y ni facet lar bo'ylab baham ko'radi (sharex=True, sharey=True). Shu holda qoldiring. Agar har bir panel o'zini qayta shkalalasa, yumshoq va tik slope lar bir xil ko'rinishi mumkin, bu esa butun solishtirishni bekor qiladi.

Ko'p group lar uchun col_wrap= va anscombe ni qayta ishlab chiqish

Bu — bobdagi eng muhim figure:

python7 qator
sns.lmplot(
    data=anscombe, x="x", y="y",
    col="dataset", hue="dataset",
    col_wrap=2, height=3.5,
    ci=None, palette="muted",
    scatter_kws={"s": 60, "alpha": 0.8},
)

To'rtta dataset, har birida o'n bitta nuqta. Fit qilingan chiziq to'rttasida ham aslida y = 3.00 + 0.500x, correlation to'rttasida ham 0.816, o'rtachalar va variance lar ikki xonagacha mos keladi. Shakllar esa bundan ham ko'proq farq qila olmasdi:

Dataset Aslida bu nima Umumlashtiruvchi statistikalar nima deydi
I Haqiqiy shovqinli linear bog'liqlik slope 0.500, r 0.816 — bu yerda to'g'ri
II Toza parabola, umuman shovqinsiz slope 0.500, r 0.816 — juda noto'g'ri
III Mukammal to'g'ri chiziq va bitta outlier slope 0.500, r 0.816 — outlier chiziqni qiyaltiradi
IV Bitta nuqtadan tashqari x doimiy slope 0.500, r 0.816 — slope bitta kuzatuv bilan aniqlanadi
python4 qator
# bir xil statistikalarni son bilan tasdiqlash
for name, sub in anscombe.groupby("dataset"):
    r = stats.linregress(sub["x"], sub["y"])
    print(name, round(r.slope, 3), round(r.intercept, 3), round(r.rvalue, 3))
Chiqish
I 0.5 3.0 0.816
II 0.5 3.001 0.816
III 0.5 3.002 0.816
IV 0.5 3.002 0.817
NIMA UCHUN BU MUHIMO'sha to'rtta dataset ning har biri faqat slope, R² va correlation ga asoslangan tekshiruvdan o'tib ketardi. Ularni faqat plot ajratadi. Bu — modellashtirishdan oldin exploratory visualisation ning butun asosi.

19.6 Bu plot lar sizga nima ayta olmaydi

Vositaning chegaralarini ochiq aytish ham uni o'rgatishning bir qismidir.

1. Hech qanday fit statistikasi qaytmaydi

Qaytarilgan obyektda na .slope, na .r_squared, na p-value bor. Seaborn ataylab fit ni ochib bermaydi. Hisobotga coefficient kerak bo'lsa, u scipy.stats.linregress, numpy.polyfit yoki statsmodels dan kelishi kerak — va keyin chizilgan chiziq bilan e'lon qilingan chiziq bir xil model ekanini tekshiring, chunki lowess, robust va order=2 ning hammasi OLS ishlab chiqarmagan narsani chizadi.

2. Extrapolation ma'nosiz

Default truncate=True aynan shu sababdan chiziqni kuzatilgan diapazonda to'xtatadi. truncate=False qo'yish chiziqni butun o'q bo'ylab cho'zadi, bu esa o'quvchini ma'lumot mavjud bo'lmagan hududda bashorat o'qishga undaydi. U yerda model ning hech qanday dalili yo'q, va 5 dan 50 dollargacha amal qiladigan linearity 500 da amal qilishi shart emas.

3. Correlation — causation emas

Fit qilingan chiziq assotsiatsiyani tavsiflaydi. U sizga x y ni keltirib chiqaradimi, y x nimi, yoki uchinchi bir o'zgaruvchi ikkalasini ham keltirib chiqaradimi — buni aytmaydi. Kattaroq hisoblar kattaroq tip lar bilan keladi — lekin ikkalasini ham party size boshqaradi, va na plot, na slope bu hikoyalarni ajrata oladi.

4. Har qanday narsa orqali to'g'ri chiziq chiziladi

Parabola ustida regplot so'rasangiz, to'liq xotirjamlik bilan chizilgan confidence band li to'g'ri chiziq olasiz. Hech nima sizni ogohlantirmaydi. Anscombe II — buning namoyishi. Tekshiruv — bu residual plot, fit plot emas.

5. Confounder lar ko'rinmaydi — Simpson paradoksi

Umumlashtirilgan trend har bir group ichidagi trend ning aynan teskarisi bo'lishi mumkin, buni penguins tumshuq misoli ko'rsatadi. Himoya — protsedura: nomzod bo'la oladigan group o'zgaruvchisi bor ekan, xulosa yozishdan oldin hue= yoki col= bilan qayta fit qiling va slope belgilarini solishtiring.

6. Faqat bitta predictor ko'rsatiladi

Bular bivariate rasmlar. Haqiqiy model larda ko'p predictor bor, va x bilan y orasidagi marginal bog'liqlik boshqa o'zgaruvchilarni nazoratga olgandan keyingi partial bog'liqlikdan belgisi bilan farq qilishi mumkin. Buning uchun sizga regplot emas, statsmodels dagi added-variable (partial regression) plot lar kerak.

7. Band model ni to'g'ri deb qabul qiladi

Bootstrap CI tanlangan forma to'g'ri degan taxmin ostida hisoblanadi. Agar forma noto'g'ri bo'lsa, band noto'g'ri chiziq atrofidagi aniq interval bo'lib qoladi. Aniqlik va to'g'rilik — bir-biriga bog'liq bo'lmagan xususiyatlar.

8. Regression umuman ma'noli ekanini hech nima tekshirmaydi

Seaborn ordinal kod ustida, integer sifatida saqlangan yil ustida yoki pandas raqamli kodlagan categorical o'zgaruvchi ustida bemalol regression qilaveradi. Function statistik emas.

19.7 Gotcha lar

⚠️ 1. Band — chiziq uchun CI, prediction interval emas

Bu birinchi raqamli noto'g'ri o'qish bo'lgani uchun qayta aytilyapti. Taxminan 95% hollarda haqiqiy o'rtacha chiziq o'sha band ichida yotadi; alohida nuqtalar esa undan ancha tashqarida bo'lishi kutiladi va ularning taxminan yarmi shunday. Seaborn umuman prediction interval chiza olmaydi — buning uchun statsmodels dan foydalaning: model.get_prediction(X).summary_frame() ham mean_ci_*, ham obs_ci_* column larini beradi.

⚠️ 2. `lmplot()` `ax=` ni qabul qilmaydi

Figure-level function. Subplot lar uchun regplot(), faceting uchun lmplot() ishlating. Natija sifatida: lmplot dan keyingi plt.title("...") faqat oxirgi facet ga sarlavha qo'yadi — g.figure.suptitle("...") yoki g.set_titles("{col_name}") dan foydalaning.

⚠️ 3. `order=2` va undan yuqorisi kichik namunalarni overfit qiladi

11 yoki 30 qator bilan quadratic yoki cubic shovqin ortidan quvadi va band o'rtada chalg'ituvchi darajada tor, chekkalarda esa portlagan bo'ladi. Shaklni o'rganish uchun lowess=True ni afzal biling, va faqat linear fit ning residual plot i haqiqiy egrilikni ko'rsatgandagina polynomial ga o'ting.

⚠️ 4. `robust=`, `lowess=` va `logistic=` statsmodels talab qiladi

Usiz ImportError: The lowess method requires statsmodels olasiz (qolganlari uchun ham shunga o'xshash xabarlar). pip install statsmodels bilan o'rnating. Va sekinlikka tayyor turing: robust va logistic fit lar band uchun n_boot marta qaytadan ishga tushadi, shuning uchun default bilan 0.2 s olgan plot 30 s yoki undan ko'proq vaqt olishi mumkin. O'rganish paytida ci=None qo'ying.

⚠️ 5. Categorical x ustida regression — bema'nilik

sns.regplot(data=tips, x="day", y="tip") yo xato beradi, yo indamay category ning ichki kodlari ustida regression qiladi, bunday holda "slope" butunlay alifbo tartibiga bog'liq bo'ladi. Agar x categorical bo'lsa, sizga regression chizig'i emas, boxplot, barplot yoki pointplot kerak — 12-bobga qarang. Tartiblangan ordinal o'zgaruvchi — kulrang hudud: chiziqni himoya qilish mumkin, lekin qanday kodlash ishlatganingizni aytib qo'ying.

⚠️ 6. NaN li qatorlar indamay tashlab yuboriladi

penguins da yetishmayotgan o'lchovlar bor va titanic["age"] da 177 ta yetishmayotgan qiymat bor. Seaborn x yoki y NaN bo'lgan har qanday qatorni ogohlantirishsiz tashlab yuboradi, shuning uchun fit len(df) dan ancha kam qatordan foydalanishi mumkin. Doim tekshiring: df[["x", "y"]].dropna().shape[0]. Bu ayniqsa facet larni solishtirganda muhim — bitta panel 30 qator ustida, boshqasi 300 qator ustida fit qilingan bo'lishi mumkin, plot esa bunga hech qanday ishora bermaydi.

⚠️ 7. Bir vaqtda faqat bitta model argument i

order=2, lowess=True yoki logistic=True, robust=True kabi birikmalar qo'llab-quvvatlanmaydi. Versiyaga qarab seaborn xato beradi yoki ulardan birini indamay e'tiborsiz qoldiradi. Har bir chaqiruvda bitta model tanlang; solishtirmoqchi bo'lsangiz, bir xil Axes ga ikkita chaqiruvni chizing.

⚠️ 8. `sns.load_dataset()` ga internet kerak

U seaborn-data GitHub repository sidan yuklab oladi va offline holatda URL xatosi bilan ishlamaydi. Chora: bir marta cache qiling — sns.load_dataset("tips").to_csv("tips.csv", index=False) va keyinroq pd.read_csv("tips.csv"); yoki github.com/mwaskom/seaborn-data ni clone qiling va sns.load_dataset("tips", data_home="path/to/seaborn-data") bering; yoki SEABORN_DATA environment variable ni o'sha papkaga sozlang.

⚠️ 9. Bootstrap band tasodifiy

Bir xil kodning ikki marta ishga tushishi band chekkalarini juda oz bo'lsa-da har xil qiladi. Ishga tushirishlar bo'ylab bayt darajasida bir xil bo'lishi kerak bo'lgan figure lar uchun seed=0 bering, yoki ci=None ishlating.

⚠️ 10. Jitter rasmni o'zgartiradi, fit ni emas

x_jitter va y_jitter faqat ustma-ust tushgan nuqtalarni ko'rsatish uchun mavjud. Regression har doim asl qiymatlar ustida hisoblanadi. Jitter qo'yilgan plot ni go'yo shovqin ma'lumotning ichida bordek tasvirlamang.

19.8 Amaliyot to'plami

python60 qator
# Barcha mashqlar uchun setup
import numpy as np, pandas as pd, matplotlib.pyplot as plt, seaborn as sns
from scipy import stats
sns.set_theme(style="whitegrid")
tips     = sns.load_dataset("tips")
penguins = sns.load_dataset("penguins")
titanic  = sns.load_dataset("titanic")
anscombe = sns.load_dataset("anscombe")

# 1. Oddiy fit va band.
#    tip va total_bill uchun regplot chizing. Keyin uni ci=None bilan va
#    ci=99 bilan qayta chizing. Band nimani anglatishini bir jumlada va
#    nimani anglatMASligini bir jumlada yozing.

# 2. Axes-level kompozitsiya.
#    plt.subplots bilan 1x3 subplot figure quring va unga uchta regplot
#    joylang: tip vs total_bill, tip vs size, total_bill vs size. Har biriga
#    sarlavha bering. Keyin xuddi shuni lmplot bilan qilishga urinib ko'ring
#    va aniq xato xabarini yozib oling.

# 3. Anscombe quartet ini qayta ishlab chiqing.
#    lmplot ni col="dataset", col_wrap=2, ci=None bilan ishlating. Keyin
#    groupby loop ichida scipy.stats.linregress bilan to'rtta dataset ning
#    har biri uchun slope, intercept va r ni chiqaring. Bir xil sonlar va
#    har xil rasmlar nima uchun ma'lumotni chizishning butun dalili ekanini
#    ikki jumlada tushuntiring.

# 4. To'g'ri model ni tanlang.
#    anscombe "II" dataset i uchun order=1, order=2 va lowess=True ni
#    yonma-yon chizing. "III" dataset i uchun default OLS ni robust=True
#    yonida chizing. Har bir holatda qaysi fit ni e'lon qilishingizni va
#    nima uchun ekanini ayting.

# 5. Residual diagnostikasi.
#    residplot(tips, x="total_bill", y="tip", lowess=True) chizing. 19.4
#    dagi to'rtta pattern dan qaysi birini ko'rayotganingizni aniqlang.
#    Keyin y=np.log(tips["tip"]) bilan takrorlang va voronka yaxshilandimi,
#    ayting.

# 6. Logistic regression.
#    titanic da survived va age ni logistic=True, y_jitter=0.03 va
#    hue="sex" bilan chizing. Har bir sex uchun bashorat qilingan omon
#    qolish ehtimoli 0.5 dan o'tadigan taxminiy yoshni o'qib oling. Keyin
#    aslida nechta qator ishlatilganini tekshiring:
#    titanic[["age","survived"]].dropna().shape.

# 7. Simpson paradoksi.
#    Barcha penguin lar birga olinganda bill_depth_mm ni bill_length_mm
#    ustida fit qiling va linregress bilan slope belgisini yozib oling.
#    Keyin uni har bir species uchun alohida fit qiling va uchta belgini
#    yozib oling. Ikkala versiyani chizing va e'tiborsiz analitik
#    umumlashtirilgan fit dan qanday bir jumlali xulosa yozgan bo'lishini
#    yozing.

# 8. Rasmdan hisobotga.
#    statsmodels OLS bilan tip ~ total_bill ni fit qiling. Slope ni, uning
#    95% confidence interval ini, p-value ni va R-squared ni chiqaring.
#    Keyin seaborn plot ini qo'lda qayta yarating: scatterplot va fit
#    qilingan coefficient lardan o'zingizning chizig'ingiz, legend da
#    tenglama bilan. Ikkala chiziq ustma-ust tushishini tasdiqlang.

19.9 Intervyu savollari

S: Seaborn ning regression chizig'i atrofidagi soyalangan hudud aniq nimani anglatadi?

Regression chizig'ining o'zi uchun 95% bootstrap confidence interval — ya'ni har bir x qiymatida y ning baholangan o'rtachasi uchun. Bu alohida kuzatuvlar uchun prediction interval emas va ma'lumotning standard deviation i ham emas. Namuna hajmi o'sgani sari u torayadi, shuning uchun ingichka band o'rtacha chiziqning joyi yaxshi baholanganini bildiradi, model yaxshi fit qilinganini yoki alohida nuqtalarni aniq bashorat qilishini emas.

S: regplot ni qachon, lmplot ni qachon ishlatasiz?

regplot — axes-level: u ax= ni qabul qiladi, siz allaqachon boshqarayotgan figure ichiga chizadi va plt.subplots yoki boshqa seaborn axes-level chaqiruvlari bilan birlashadi. lmplot — figure-level: u o'z figure ini yaratadi va unga egalik qiladi, FacetGrid qaytaradi, col= va row= faceting ni qo'llab-quvvatlaydi, ax= ni esa rad etadi. Tuzilgan layout ichida regplot dan foydalaning; maqsad bir xil fit ni subgroup lar bo'ylab solishtirish bo'lsa, lmplot dan.

S: Bu funksiyalardan slope, intercept yoki R² ni olsa bo'ladimi?

Yo'q. Seaborn model ni ichkarida fit qiladi — polynomial fit lar uchun numpy orqali, lowess, robust va logistic uchun statsmodels orqali — lekin faqat chizish obyektlarini qaytaradi. Sonlarni e'lon qilish uchun scipy.stats.linregress (slope, intercept, r, p, stderr), numpy.polyfit (faqat coefficient lar), yoki confidence interval lar va diagnostikalar bilan to'liq summary uchun statsmodels.api.OLS(...).fit() dan foydalaning.

S: Nima uchun Anscombe quartet i bu bobdagi standart misol?

O'n bitta nuqtali to'rtta dataset deyarli bir xil o'rtacha, variance, correlation (0.816) va fit qilingan chiziqni (taxminan y = 3 + 0.5x) baham ko'radi, biroq biri haqiqatan linear, biri toza parabola, biri bitta outlier buzgan to'g'ri chiziq, va biri bitta leverage nuqtasidan tashqari doimiy x ga ega. Umumlashtiruvchi statistikalar ularni ajrata olmaydi; plot esa ularni bir zumda ajratadi. Bu — fit ga ishonishdan oldin ma'lumotga qarash kerakligining eng kuchli dalili.

S: Yaxshi residual plot qanday ko'rinadi va ikkita yomon pattern ni ayting.

Yaxshi: nol atrofida markazlashgan, x yoki fitted qiymatlarning butun diapazoni bo'ylab taxminan bir xil vertikal tarqoqlikka ega strukturasiz bulut. Birinchi yomon pattern — egrilik, ya'ni tabassum yoki qovoq shakli, bu linear forma da non-linear had yetishmayotganini bildiradi; yechim polynomial had yoki x ni yoki y ni transformatsiya qilish. Ikkinchi yomon pattern — voronka, unda tarqoqlik x bilan kengayadi — heteroscedasticity; coefficient lar hamon bir tomonlama bo'lmasligi mumkin, lekin standard error lar va confidence band ishonchsiz, shuning uchun log(y) kabi variance ni barqarorlashtiruvchi transform yoki robust standard error lardan foydalaning.

S: Scatter ingizda bir nechta ekstremal nuqta bor. Seaborn da qanday variantlaringiz bor?

Avval ularga qarang: ular ma'lumot kiritish xatosi, boshqa populyatsiya yoki haqiqiy kam uchraydigan holat bo'lishi mumkin, va har bir holatda javob har xil. Seaborn ichida robust=True ularning vaznini kamaytiradigan robust linear model ni fit qiladi, va uni default OLS chizig'i bilan solishtirish ular qanchalik ta'sirga ega ekanini ko'rsatadi. U statsmodels talab qiladi va bootstrap tufayli sekin, shuning uchun o'rganish paytida uni ci=None bilan birga ishlating. Nuqtalarni faqat chiziqni siljitgani uchun hech qachon o'chirmang.

S: Natija binary bo'lganda regression ni qanday chizasiz?

Numeric 0/1 y bilan logistic=True ishlating — masalan sns.lmplot(data=titanic, x="age", y="survived", logistic=True). Bu logistic regression ni fit qiladi va to'g'ri chiziq o'rniga S shaklidagi bashorat qilingan ehtimol egri chizig'ini chizadi, shunda bashoratlar [0, 1] ichida qoladi. 0 lar va 1 lardan iborat ikkita chiziq o'z zichligini ko'rsatishi uchun y_jitter qo'shing va jitter faqat ko'rinish uchun ekanini unutmang. U statsmodels talab qiladi va katta ma'lumotda sekin, shuning uchun ci=None ni o'ylab ko'ring.

S: Simpson paradoksi nima va uni bu yerda qanday tekshirasiz?

Bu — umumlashtirilgan ma'lumotdagi assotsiatsiya ma'lumot tegishli group o'zgaruvchisi bo'yicha bo'linganda teskarisiga aylanadigan yoki yo'qoladigan holat. penguins da bill length va bill depth umumiy holda manfiy bog'langan, lekin har bir species ichida musbat bog'langan — umumlashtirilgan chiziq aslida species lar orasidagi farqlarni tavsiflaydi. Tekshiruv — har bir nomzod group o'zgaruvchisini hue= yoki col= ga qo'yib qayta fit qilish va biror xulosa yozishdan oldin slope belgilarini solishtirish.

S: Bu plot larda nima indamay noto'g'ri ketishi mumkin?

Ayniqsa uchta narsa. x yoki y da NaN bo'lgan qatorlar hech qanday ogohlantirishsiz tashlab yuboriladi, shuning uchun fit DataFrame dagidan ancha kam kuzatuvga tayanishi mumkin — va facet lar juda har xil namuna hajmlari bilan qolib ketishi mumkin. Categorical x o'zining ichki integer kodlari ustida regression qilinishi mumkin, bu esa slope ni alifbo tartibining sun'iy mahsuliga aylantiradi. Va egri ma'lumot orqali hech qanday e'tirozsiz, ishonch bilan to'g'ri chiziq chiziladi — aynan shu sababdan haqiqiy diagnostika fit plot emas, residual plot dir.

19.10 Xulosa

  • regplot() — axes-level (ax= ni qabul qiladi, o'zingizning figure laringiz ichiga birlashadi); lmplot() — figure-level (FacetGrid qaytaradi, col=/row= ni qo'llab-quvvatlaydi, ax= ni rad etadi). Ular har bir statistik argument ni baham ko'radi.
  • Soyalangan band — regression chizig'i uchun 95% bootstrap confidence interval — prediction interval emas, standard deviation emas, va model to'g'ri ekanining dalili ham emas. Uni ci=None bilan olib tashlang.
  • Ikkala function ham model ni fit qiladi va ikkalasi ham son qaytarmaydi. Slope, p-value yoki R² e'lon qilinishi kerak bo'lganda scipy.stats.linregress, numpy.polyfit yoki statsmodels dan foydalaning.
  • Model variant lari: polynomial lar uchun order=, taxminsiz shakl uchun lowess=True, outlier larga qarshi robust=True, binary y uchun logistic=True, diskret yoki shovqinli x uchun x_estimator=np.mean va x_bins=. Har bir chaqiruvda faqat bitta model; oxirgi uchtasiga statsmodels kerak va ular sekin.
  • residplot() trend ni olib tashlaydi, shunda qolib ketgan struktura ko'rinadi. Yaxshi residual plot — nol atrofidagi shaklsiz bulut; egrilik, voronka va yolg'iz outlier lar har biri aniq bir yechimga ishora qiladi.
  • hue=, col= va row= har bir group uchun alohida chiziq fit qiladi. Umumlashtirilgan trend ni qabul qilishdan oldin doim buni sinang — Simpson paradoksi haqiqiy va penguins buni ikki qator kodda ko'rsatadi.
  • Anscombe quartet i: bir xil slope, intercept va correlation ga ega, lekin to'rt xil shaklga ega to'rtta dataset. Fit ga ishonishdan oldin chizing.
  • Ma'lum chegaralar: fit statistikasi yo'q, ma'nosiz extrapolation, kauzal da'vo yo'q, faqat bitta predictor, va model formasi to'g'ri deb qabul qiladigan band.
  • Indamay yuz beradigan nosozliklarga e'tibor bering: tashlab yuborilgan NaN lar, kodlar ustida regression qilingan categorical x, kichik namunalardagi yuqori darajali polynomial lar, va internet talab qiladigan sns.load_dataset().

Keyingisi: 20-bob multi-plot grid larni qamrab oladi — FacetGrid, pairplot va jointplot.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar