Regression plot lar
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:
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:
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:
- xom kuzatuvlarning scatter i;
- atrofida soyalangan band bo'lgan fit qilingan chiziq.
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 |
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.
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
# 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:
sns.regplot( data=tips, x="total_bill", y="tip", scatter_kws={"alpha": 0.4, "s": 25, "color": "#7a7a7a"}, line_kws={"color": "crimson", "linewidth": 2}, )
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
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.
g = sns.lmplot(data=tips, x="total_bill", y="tip") print(type(g)) # seaborn.axisgrid.FacetGrid g.set_axis_labels("Total bill ($)", "Tip ($)")
<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 |
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.
# 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
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
# 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.
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
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
# 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.
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:
ynumeric 0/1 bo'lishi kerak, "yes"/"no" string lari emas.titanic["survived"]allaqachon 0/1;alivekabi column uchun(titanic["alive"] == "yes").astype(int)kerak bo'lardi.y_jitter=(vax_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.
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:
# 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:
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())
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.
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
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.
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:
sns.residplot(data=tips, x="total_bill", y="tip", lowess=True, line_kws={"color": "crimson"})
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.
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.
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
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.
# 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")
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
# 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.
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:
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 |
# 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))
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
# 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 (FacetGridqaytaradi,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=Nonebilan 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.polyfityokistatsmodelsdan foydalaning. - Model variant lari: polynomial lar uchun
order=, taxminsiz shakl uchunlowess=True, outlier larga qarshirobust=True, binary y uchunlogistic=True, diskret yoki shovqinli x uchunx_estimator=np.meanvax_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=varow=har bir group uchun alohida chiziq fit qiladi. Umumlashtirilgan trend ni qabul qilishdan oldin doim buni sinang — Simpson paradoksi haqiqiy vapenguinsbuni 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.