Asosiy qismga o'tish

Distribution plot lar

16-bob 23 kod bloki 6834 so'z

Distribution plot bitta savolga javob beradi: bitta o'zgaruvchining qiymatlari qanday tarqalgan? O'rtacha ham emas, boshqa narsa bilan bog'liqlik ham emas — aynan shakl. Qiymatlar qayerda to'planadi, qayerda kam uchraydi, bitta peak bormi yoki ikkitami, o'ng tomondagi tail uzunmi, umuman bo'lishi mumkin bo'lmagan qiymatlar bormi.

Bu bobda seaborn ning to'rtta axes-level distribution function i — sns.histplot(), sns.kdeplot(), sns.ecdfplot(), sns.rugplot() — hamda ulardan dastlabki uchtasini subplot lar grid ida chizib bera oladigan figure-level wrapper sns.displot() ko'rib chiqiladi.

📌 `distplot` endi yo'q

Agar sns.distplot() ishlatilgan tutorial lar, StackOverflow javoblari yoki eski kurs notebook lariga duch kelsangiz, ular seaborn 0.10 yoki undan oldingi versiyalar uchun yozilgan. distplot 0.11 da deprecated qilingan va 0.14 da butunlay olib tashlangan. U bitta function ichida histogram ham, KDE ham, rug ham bo'lishga urinar, default lari esa chalkash edi (KDE yoqilganda y o'qini ovoz chiqarmasdan density ga o'tkazib yuborardi). Uning o'rnini bosuvchilar: axes-level histogram uchun sns.histplot(), figure-level variant uchun sns.displot(), density curve uchun sns.kdeplot(). sns.distplot(x) ning so'zma-so'z ekvivalenti — sns.histplot(x, kde=True, stat="density").

Quyidagi barcha misollar seaborn ning ichki example dataset laridan foydalanadi, shuning uchun har bir snippet ni o'zgartirmasdan ishga tushirishingiz mumkin:

python8 qator
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")

penguins = sns.load_dataset("penguins")
tips     = sns.load_dataset("tips")
titanic  = sns.load_dataset("titanic")

penguins da 344 ta row bor: flipper_length_mm, bill_length_mm, body_mass_g, shuningdek species, island, sex. Bu distribution larni o'rgatish uchun standart dataset, chunki species larni aralashtirganda flipper length haqiqatan ham bimodal bo'lib chiqadi — bu esa bin tanlash haqiqatni qanday yashirib qo'yishi mumkinligini ko'rsatish uchun ideal.

16.1 histplot — histogram

Histogram son o'qini bin deb ataluvchi ketma-ket oraliqlarga bo'ladi, har bir bin ga nechta observation tushganini sanaydi va balandligi shu songa teng bo'lgan bar chizadi.

python2 qator
sns.histplot(data=penguins, x="flipper_length_mm")
plt.show()

Penguin flipper uzunligining histogram i. Ikkita do‘nglik — real signal, ya’ni har xil species lar.

Butun g'oya shundan iborat. Qolgan hamma narsa — shu asosning ustidagi sozlagichlar.

🧩 O'xshatish

Tasavvur qiling, imtihon varaqlarini stol ustida to'plamlarga ajratyapsiz: 0–10, 10–20, 20–30 va hokazo. Histogram — shu to'plamlar balandligining fotosurati. Agar to'plam chegaralarini o'zgartirsangiz — 0–20, 20–40 — birorta ham varaq joyidan qimirlamagan bo'lsa-da, fotosurat o'zgaradi. Ma'lumot qat'iy; rasm esa sizning tanlovingiz.

Muhim parametrlar

Parametr Default Vazifasi
x / y — O'zgaruvchi. Histogram ni gorizontal chizish uchun x= o'rniga y= bering.
bins "auto" Bin lar soni, yoki aniq bin chegaralari ro'yxati, yoki numpy binning qoidasining nomi.
binwidth None Har bir bin ning ma'lumot birligidagi kengligi. bins ni bekor qiladi.
binrange None Bin lar qayerga joylashishini cheklovchi (min, max) tuple.
stat "count" Bar balandligining ma'nosi: "count", "frequency", "probability" (= "proportion"), "percent", "density".
kde False Ustiga silliqlangan density curve qo'shadi va uni histogram ga moslab masshtablaydi.
element "bars" "bars", "step" (faqat kontur), "poly" (o'rta nuqtalar tutashtiriladi).
multiple "layer" hue guruhlari qanday joylashtiriladi: "layer", "dodge", "stack", "fill".
cumulative False Har bir bar oldingilarini ham qo'shib boradi — ECDF ning zinapoyali varianti.
common_norm True hue bilan: normalization guruhlar bo'ylab umumiy bo'ladimi yoki har bir guruh uchun alohida bajariladimi.
common_bins True hue bilan: barcha guruhlar bir xil bin chegaralaridan foydalanadimi. Deyarli har doim True qoldiring.
discrete False Har bir butun songa markazlashgan bitta bin. tips dagi size kabi sanoq qiymatlar uchun ishlating.
shrink 1 Bar kengligini masshtablaydi, masalan 0.8 discrete bar lar orasida bo'shliq hosil qiladi.
log_scale False True bo'lsa bin lar log scale da hisoblanadi — kuchli o'ngga skew qilingan pul yoki count ma'lumotlari uchun zarur.

stat= — balandlik nimani anglatadi

Bu — ma'lumot tahlilida eng ko'p noto'g'ri o'qiladigan o'q. Beshta variant beshta har xil savolga javob beradi.

stat Bar balandligi Bar lar yig'indisi Qachon ishlatiladi
"count" Bin dagi observation lar soni n Bitta guruh; sizni nechta ekani qiziqtiradi.
"frequency" count ÷ binwidth — Kengligi har xil bo'lgan bin lar.
"probability" count ÷ n 1 Hajmi har xil guruhlarni solishtirish.
"percent" 100 × count ÷ n 100 Xuddi shu, lekin texnik bo'lmagan auditoriya uchun tushunarliroq.
"density" count ÷ (n × binwidth) yuza = 1 KDE yoki nazariy distribution bilan solishtirish.
ASOSIY"probability" va "percent" da balandliklar yig'indisi 1 / 100 ga teng bo'ladi. "density" da esa yuza 1 ga teng bo'ladi, shuning uchun bin lar tor bo'lsa balandliklar 1 dan oshib ketishi mumkin. 0.06 ga teng density — bu "6%" degani emas.
python6 qator
# bir xil ma'lumot, y o'qining to'rt xil ma'nosi
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
for ax, s in zip(axes.flat, ["count", "probability", "percent", "density"]):
    sns.histplot(data=penguins, x="flipper_length_mm", stat=s, binwidth=5, ax=ax)
    ax.set_title(f'stat="{s}"')
plt.tight_layout()

To'rtala rasmning shakli bir xil. Faqat y o'qidagi sonlar o'zgaradi. Gap ham shunda: stat hech qachon ma'lumotni o'zgartirmaydi, u faqat balandlikning o'lchov birligini o'zgartiradi.

element= — bars, step, poly

python2 qator
sns.histplot(data=penguins, x="flipper_length_mm", hue="species",
             element="step", fill=False)

element="bars" — default va bitta guruh uchun to'g'ri tanlov. Uchta guruhni ustma-ust chizganingizda esa to'ldirilgan bar lar bir-birini berkitadi; element="step" ni fill=False bilan ishlatsangiz faqat kontur chiziladi va uchala profil ham ko'rinib turadi. element="poly" bin larning cho'qqilarini to'g'ri chiziqlar bilan tutashtiradi — ko'rinishi KDE ga yaqin, lekin hech qanday silliqlash farazi yo'q, chunki har bir uchi haqiqiy bin count idir.

Discrete ma'lumot

python2 qator
# mehmonlar soni butun sanoq qiymati, uzluksiz o'lchov emas
sns.histplot(data=tips, x="size", discrete=True, shrink=0.8)

discrete=True bo'lmasa avtomatik bin chegaralari butun sonlar orasiga tushib qolishi va "2" bilan "3" ni bitta bar ga qo'shib yuborishi, yoki bitta butun sonni ikkita bar ga bo'lib tashlashi mumkin — natijada hech qanday ma'no anglatmaydigan taroqsimon pattern hosil bo'ladi. discrete=True har bir butun songa bitta bin ni markazlashtiradi; shrink=0.8 esa ko'rinadigan bo'shliqlar qo'shadi va grafik count lar bar chart i sifatida o'qiladi.

Skew qilingan ma'lumot va log_scale

python3 qator
# fare lar juda kuchli o'ngga skew qilingan: ko'pchiligi arzon, bir nechtasi juda qimmat
sns.histplot(data=titanic, x="fare", bins=30)          # bitta baland bar va uzun bo'sh tail
sns.histplot(data=titanic, x="fare", bins=30, log_scale=True)  # o'qish mumkin

Chiziqli scale da fare larning 90% i eng chap bar ga siqilib qoladi, £512 lik chiptalar esa o'qni cho'zib yuboradi. log_scale=True bin larni log fazoda hisoblaydi, ya'ni tartib darajalari bo'yicha teng kenglikdagi bin lar beradi va class strukturasini ochib beradi. E'tibor bering, log_scale nol va manfiy qiymatlar bilan ishlay olmaydi — Titanic da 0 ga teng fare lar bor va ular log scale li plot dan tushib qoladi, shuning uchun ularni yo'q deb ko'rsatish o'rniga caption da eslatib o'ting.

16.2 Bin larni tanlash — eng muhim qaror

Bu bobdagi qolgan hamma narsa — styling. Bu bo'lim esa statistika. Bin soni — silliqlash parametri va o'quvchi qanday xulosaga kelishini aynan u hal qiladi.

Bir xil ma'lumot, to'rt xil hikoya

python5 qator
fig, axes = plt.subplots(1, 4, figsize=(16, 3.5), sharey=False)
for ax, b in zip(axes, [3, 12, 30, 120]):
    sns.histplot(data=penguins, x="flipper_length_mm", bins=b, ax=ax)
    ax.set_title(f"bins={b}")
plt.tight_layout()

Histogram dagi eng muhim qaror. 4 ta bin da taqsimot bir cho‘qqili ko‘rinadi; 25 tada ikkita species chiqadi; 120 tada esa u shovqinga aylanadi. Doim bir nechtasini sinab ko‘ring.

Uni ishga tushiring va to'rtta panelni chapdan o'ngga qarab o'qing:

bins O'quvchi nimani ko'radi Nimasi noto'g'ri
3 Bitta to'da — "flipper length unimodal, markazi 200 mm atrofida" Ortiqcha silliqlangan. Ikkita species klasteri bitta bar ichida o'rtachalanib ketgan. Haqiqiy, biologik ma'noli xususiyat o'chirib tashlangan.
12 190 mm va 215 mm atrofida ikkita aniq do'nglik To'g'riga yaqin. Bu — halol tasvir.
30 Ikkita do'nglik, lekin notekis, har birining ichida bir nechta kichik cho'kmalar bor Sampling noise ni struktura sifatida ko'rsata boshlagan.
120 Balandligi 1 va 0 bo'lgan bar lardan iborat panjara Yetarlicha silliqlanmagan. 344 ta row va 120 ta bin da har bir bin ga taxminan 3 tadan nuqta to'g'ri keladi; siz distribution ni emas, o'lchov to'rini chizyapsiz.
MUROSABin lar kam = past variance, yuqori bias (haqiqiy xususiyatlar silliqlanib yo'qoladi). Bin lar ko'p = past bias, yuqori variance (noise xususiyatga o'xshab ko'rinadi). Mavhum tarzda "to'g'ri" bo'lgan bin soni yo'q — faqat sizning sample hajmingizga va ko'rmoqchi bo'lgan xususiyatingizga mos keladigani bor.

Default qayerdan kelib chiqadi

Seaborn ning default i — bins="auto", u buni numpy.histogram_bin_edges ga uzatadi. NumPy ning "auto" si ikkita klassik qoidadan eng katta bin width ni oladi — ya'ni ehtiyotkorroq, silliqroq javobni:

Qoida Bin width Xatti-harakati
Sturges range ÷ (1 + log₂ n) Ma'lumot taxminan normal deb faraz qiladi. Katta yoki skew qilingan sample larni juda yomon ortiqcha silliqlaydi.
Freedman–Diaconis 2 × IQR ÷ n1/3 IQR dan foydalanadi, shuning uchun outlier lar uni shishirib yubormaydi. Barqaror; asosiy ish quroli.
Scott 3.49 × σ ÷ n1/3 FD ga o'xshaydi, lekin standart og'ishdan foydalanadi, shuning uchun outlier lar bin larni kengaytiradi.
⚠️ Default — evristika, haqiqat emas

Bu formulalarning har biri asosdagi density silliq va taxminan unimodal degan faraz ostida xato mezonini minimallashtirish yo'li bilan keltirib chiqarilgan. Bimodal ma'lumot bu farazni buzadi — va aynan shunday paytda sizga ikkinchi mode ni ko'rish eng ko'p kerak bo'ladi. Default bin soni — sizning ma'lumotingiz shakliga umuman qaramagan formula bergan o'rinli birinchi taxmin. Uni tahlilning boshlanishi deb qabul qiling, yakuni deb emas.

bins o'rniga binwidth ni afzal ko'ring

python5 qator
# "30 ta bin" o'quvchiga hech narsa demaydi; "har bin 5 mm" esa ma'noli
sns.histplot(data=penguins, x="flipper_length_mm", binwidth=5)

# soha tabiiy chegaralarga ega bo'lganda aniq chegaralarni bering
sns.histplot(data=titanic, x="age", bins=[0, 12, 18, 30, 45, 60, 80])

Avval binwidth ga murojaat qilishning uchta sababi bor:

  • U tushunarli. "Har bir bar — bitta 5 mm lik oraliq" — o'quvchi tekshira oladigan gap. "30 ta bin" esa yo'q.
  • U subset lar bo'ylab barqaror. Agar species bo'yicha facet qilsangiz, bins=30 har bir panelga har xil range ustida 30 tadan bin beradi, ya'ni panellar solishtirib bo'lmaydigan bo'lib qoladi. binwidth=5 esa har bir panelga bir xil fizik bin ni beradi, shuning uchun bar balandliklari hamma joyda bir xil ma'no anglatadi.
  • U o'lchov aniqligini hisobga oladi. Agar flipper length eng yaqin millimetrgacha qayd etilgan bo'lsa, 0.5 mm lik bin width ma'nosiz — bin larning yarmi tuzilishiga ko'ra bo'sh bo'ladi.
💡 Amaliy tartib
  1. Default bilan chizing. 2. Bin sonini taxminan ikki barobar kamaytirib va ikki barobar oshirib yana chizing. 3. Uchala variantda ham saqlanib qolgan har qanday xususiyat haqiqiy; faqat bittasida paydo bo'lgani esa katta ehtimol bilan binning artefakti. 4. Saqlanib qolgan xususiyatlarni eng kam noise bilan ko'rsatadigan variantni chop eting va caption da bin width ni yozib qo'ying. Agar yozgan xulosangiz bin soniga bog'liq bo'lsa, u ma'lumot haqidagi xulosa emas.

Bin ning faqat kengligi emas, boshlanish nuqtasi ham muhim. Barcha chegaralarni yarim bin ga surish peak ni birlashtirib yoki ikkiga bo'lib yuborishi mumkin. Aynan shu beqarorlik xulosangizni umuman bin lari yo'q ECDF bilan tekshirib ko'rish uchun eng kuchli dalildir.

16.3 kdeplot — density va bandwidth

Kernel density estimate har bir observation ni kichik silliq do'nglik bilan almashtiradi — default da Gaussian bilan — va barcha do'ngliklarni qo'shib chiqadi. Natijada umumiy yuzasi 1 ga teng bo'lgan uzluksiz curve hosil bo'ladi.

sns.kdeplot(data=penguins, x="flipper_length_mm", fill=True)

Bandwidth — KDE dagi bin width ning ekvivalenti. Juda kichik bo‘lsa tuzilma o‘ylab topadi; juda katta bo‘lsa ikkita species ni bitta do‘nglikka silliqlab yuboradi.

🧩 O'xshatish

Histogram har bir observation ni qattiq quti ichiga tashlaydi. KDE esa har bir observation ni kichik qum uyumi sifatida tashlaydi; uyumlar bir-biriga qo'shilib, qum tepaligiga aylanadi. Bandwidth — har bir qum uyumi qanchalik keng yoyilishi. Keng uyumlar bitta silliq tepalik beradi; tor uyumlar esa har bir donaga bitta cho'qqi to'g'ri keladigan tikanli manzara beradi.

Bandwidth: bin lardagi bilan aynan bir xil murosa

Bandwidth — bu KDE ning bin width i. Seaborn uni default da Scott qoidasi bilan tanlaydi va ko'paytiruvchi orqali masshtablashga ruxsat beradi:

python4 qator
for adj in [0.25, 0.5, 1, 2]:
    sns.kdeplot(data=penguins, x="flipper_length_mm",
                bw_adjust=adj, label=f"bw_adjust={adj}")
plt.legend()

bw_adjustPenguin flipper length dagi natija

0.25Ko'plab kichik lokal peak lari bor to'lqinsimon curve — asosan noise. 0.5Ikkita toza mode, biroz o'tkir. Ko'pincha bimodal ma'lumot uchun eng yaxshi ko'rinish. 1 (default)Ikkita mode, lekin ular orasidagi botiq sayoz. 2Bitta keng do'nglik. Bimodallik butunlay silliqlanib yo'q qilingan.

⚠️ Bandwidth haqiqiy strukturani o'chirib yuborishi mumkin

Scott qoidasi bitta Gaussian uchun optimal. Bir-birining ustiga tushadigan ikkita Gaussian ga qo'llanganda esa u umumiy tarqalishga mos bandwidth ni tanlaydi — bu har ikkala mode uchun ham juda keng — va haqiqatan bimodal bo'lgan distribution ni bitta do'nglikka silliqlab qo'yishi mumkin. Agar siz faqat default KDE ga qarasangiz, ishonch bilan noto'g'ri shaklni e'lon qilasiz. "Unimodal" degan xulosaga kelishdan oldin KDE ni har doim histogram yoki ECDF bilan solishtirib tekshiring.

KDE parametrlari

Parametr Ma'nosi
bw_adjust Avtomatik bandwidth ga ko'paytiruvchi. 1 dan kichik = ko'proq tafsilot, 1 dan katta = silliqroq.
bw_method "scott" (default), "silverman", yoki absolute bandwidth uchun son.
fill Curve ostini bo'yaydi. Bitta guruh uchun chiroyli; to'rtta ustma-ust tushgani uchun loyqa.
cut Curve chekka nuqtalardan qancha uzoqqa chizilishi, bandwidth birligida. Default 3.
clip (low, high) qat'iy chegaralar. Ulardan tashqarida hech narsa chizilmaydi.
cumulative Integrallangan curve ni chizadi — silliqlangan CDF. SciPy talab qiladi.
common_norm hue bilan: True barcha guruhlar yuzasining yig'indisini 1 qiladi, False esa har bir guruhning yuzasini 1 qiladi.
multiple "layer" (default), "stack", "fill". "dodge" yo'q — curve lar yon-yonga surila olmaydi.
weights Har bir observation uchun weight lar, masalan so'rovnoma sampling weight lari.

Chegara muammosi

python9 qator
# tip miqdori qat'iy musbat, lekin default KDE buni bilmaydi
sns.kdeplot(data=tips, x="tip", fill=True)
# curve 0 dan pastga cho'ziladi -> go'yo manfiy tip lar bo'lishi mumkindek

# yechim 1: curve ni ma'lumot tugagan joyda to'xtatish
sns.kdeplot(data=tips, x="tip", fill=True, cut=0)

# yechim 2: ma'lum fizik chegarada qat'iy to'siq qo'yish
sns.kdeplot(data=tips, x="tip", fill=True, clip=(0, None))
⚠️ KDE ma'lumot yo'q joyda density o'ylab topadi

Har bir Gaussian kernel cheksiz supportga ega, shuning uchun tip = 1.00 dagi observation −0.5 ga ham ozgina ehtimollik massasini joylashtiradi. cut=3 da curve eng kichik observation dan uchta bandwidth naridagi masofagacha chiziladi va siz o'zgaruvchi umuman mavjud bo'la olmaydigan hududda ko'rinarli noldan farqli density ni olasiz. Bu rendering artefakti emas — estimator haqiqatan ham u yerga massa ajratadi va shu bilan birga density ni haqiqiy chegaradan tortib oladi, ya'ni nolga yaqin qiymatlar nechta ekanini kamaytirib ko'rsatadi. Ma'lumotdan naridagi qismni chizmaslik uchun cut=0 dan, fizik cheklovni aniq ifodalash uchun clip=(0, None) dan foydalaning. Qat'iy musbat va skew qilingan o'zgaruvchilar uchun ko'pincha log_scale=True ustidagi KDE yaxshiroq yechim bo'ladi.

Histogram va KDE birgalikda

python2 qator
sns.histplot(data=penguins, x="flipper_length_mm",
             bins=20, kde=True)

kde=True bilan seaborn density ni hisoblaydi va uni bar lar ishlatayotgan stat ga moslab qayta masshtablaydi, shuning uchun curve bar larga vizual mos tushadi. Bu o'qitish uchun foydali tekshiruv ko'rinishi — bar lar xom dalilni ko'rsatadi, curve esa silliqlangan o'qishni. Shuningdek, bu kelishmovchilikni ochib berishning halol usuli: agar curve "bitta mode" desa, bar lar esa "ikkita" desa, siz bandwidth ingiz haqida biror narsa bilib oldingiz.

16.4 ecdfplot va rugplot

Empirik kumulyativ distribution function

sns.ecdfplot(data=penguins, x="flipper_length_mm")

ECDF da bin ham, bandwidth ham yo‘q — sozlanadigan narsa yo‘q, demak tasodifan chalg‘itadigan narsa ham yo‘q. Uni “qanday ulush shu qiymatdan past?” deb o‘qing.

x o'qidagi har bir v qiymati uchun ECDF v dan kichik yoki unga teng bo'lgan observation lar ulushini chizadi. Bu — chapda 0 dan boshlanib o'ngda 1 da tugaydigan zinapoya, har bir ma'lumot nuqtasida balandligi 1/n bo'lgan bitta zina bilan.

NEGA MUHIMECDF da hech qanday silliqlash parametri yo'q. Bin ham, bandwidth ham, sozlanadigan hech narsa yo'q. Bir xil column berilgan ikkita tahlilchi bayt-mabayt bir xil ECDF hosil qiladi. Uchala plot ichida faqat shuni tasodifan — yoki ataylab — biror xulosani qo'llab-quvvatlash uchun sozlab bo'lmaydi.

ECDF o'qishni o'rganish bir necha daqiqa mashq talab qiladi, keyin esa u sizning asboblaringiz orasida eng tezkoriga aylanadi:

  • Median va quantile lar to'g'ridan-to'g'ri o'qiladi. 0.5 da gorizontal chiziq chizing va o'qqa tushing: bu median. 0.9 da: 90-persentil.
  • Tik = zich, tekis = siyrak. Vertikal sakrash bitta qiymatda ko'p observation borligini bildiradi; uzun gorizontal cho'zilish esa ma'lumotdagi bo'shliqni.
  • Bimodallik ikkita tik qism orasidagi bitta tekis qism ko'rinishida namoyon bo'ladi. Ikkita do'nglikchalik ko'zga tashlanmaydi, lekin u bor va u artefakt emas.
  • Guruhlarni solishtirish aniq bo'ladi. Hech qachon kesishmaydigan ikkita ECDF bitta guruh har bir quantile da stoxastik jihatdan kattaroq ekanini bildiradi — bu "o'rtachalari farq qiladi" dan ancha kuchli da'vo.
python7 qator
sns.ecdfplot(data=penguins, x="flipper_length_mm", hue="species")

# complementary ECDF: v dan YUQORI ulush — survival/latency uchun tabiiy
sns.ecdfplot(data=titanic, x="fare", complementary=True)

# ulush o'rniga count, absolyut sonlar muhim bo'lganda
sns.ecdfplot(data=titanic, x="age", stat="count")

Uning narxi — shakl haqidagi halollik: ECDF keng auditoriyaga "bu taxminan normal" degan fikrni yetkazishda yomon va mode larni ko'rsatish ancha qiyin. Undan tahlil va aniq guruh solishtirish uchun foydalaning; auditoriyaga shakl bir qarashda kerak bo'lsa, histogram ishlating.

Rug plot

python2 qator
sns.kdeplot(data=penguins, x="flipper_length_mm", fill=True)
sns.rugplot(data=penguins, x="flipper_length_mm", height=0.05)

Rug o'q bo'ylab har bir observation uchun bitta qisqa chiziqcha chizadi. Yolg'iz o'zi deyarli foydasiz; KDE ostiga qatlam qilib qo'yilsa esa bu siz shakllantira oladigan eng qimmatli odatlardan biri, chunki u ma'lumot aslida qayerda ekanini aniq ko'rsatadi. KDE curve ining bo'sh rug uchastkasi ustida turgan har qanday qismi — silliqlagichning sof ekstrapolyatsiyasi. n katta bo'lganda chiziqchalar bir-birining ustiga tushib yaxlit polosaga aylanadi — alpha=0.3 qo'ying yoki histogram ga o'ting.

histplot va kdeplot ham rug larni bilvosita displot(..., rug=True) orqali chiza oladi.

Solishtirish jadvali

histplot kdeplot ecdfplot
Nimani ko'rsatadi Oraliqdagi count lar Silliq baholangan density Kumulyativ ulush
Sozlash parametri bins / binwidth bandwidth (bw_adjust) yo'q
Nimani yashiradi Bitta bin dan mayda strukturani; chegara joylashuviga sezgir Xom ma'lumotni; chegaralarni; sample hajmini Mode larni ko'rish qiyin
Nimani o'ylab topadi Hech narsani — bar lar haqiqiy count lar Bo'sh hududlarda va fizik chegaralardan tashqarida density Hech narsani
Sample hajmi ko'rinadimi? Ha (stat="count" bilan) Yo'q — 5 nuqtali KDE 5000 nuqtalisi kabi ishonchli ko'rinadi Ha (zina balandligi = 1/n)
2–3 guruhni solishtirish O'rtacha, element="step" yoki dodge kerak Yaxshi, toza overlay Eng yaxshisi — aniq va qat'iy
5+ guruhni solishtirish Yomon Yomon Hamon ishlaydi
Quantile larni o'qish Qiyin Imkonsiz To'g'ridan-to'g'ri
Auditoriya Har kim Texnik Texnik
Qachon ishlatiladi Birinchi qarash; count larni ko'rsatish; discrete ma'lumot Bir nechta guruhni ustma-ust chizish; hisobot uchun silliq shakl Aniq solishtirish; quantile lar; silliqlashga ishonmasangiz
💡 Uch plot odati

Har bir yangi sonli column uchun uchalasini ham chizing. Agar histogram, KDE va ECDF bir xil hikoyani aytsa, unga ishonish mumkin. Agar ular kelishmasa, kelishmovchilikning o'zi topilma bo'ladi — odatda bu juda keng bandwidth, juda qo'pol bin width, yoki KDE silliq do'nglikka aylantirib yuborgan takrorlanuvchi qiymatlar cho'qqisi (yaxlitlangan yoshlar, default nollar).

16.5 displot — figure-level interface

sns.displot() — bu to'rtinchi turdagi plot emas. Bu sizning o'rningizga histplot, kdeplot yoki ecdfplot ni o'z figure ida chaqiradigan, xohlasangiz subplot lar grid iga ajratib beradigan wrapper.

python8 qator
sns.displot(data=penguins, x="flipper_length_mm")                 # kind="hist" default
sns.displot(data=penguins, x="flipper_length_mm", kind="kde")
sns.displot(data=penguins, x="flipper_length_mm", kind="ecdf")

# undan foydalanishning asosiy sababi: faceting
g = sns.displot(data=penguins, x="flipper_length_mm",
                col="species", row="sex",
                binwidth=5, height=3, aspect=1.2)

Axes-level (histplot)Figure-level (displot)

Nima qaytaradimatplotlib.axes.Axes``seaborn.FacetGrid Qayerga chizadiJoriy axes ga yoki ax= gaO'zi yaratgan va o'ziga tegishli yangi figure ga ax= ni qabul qiladimiHaYo'q — asosiy farq shu Faceting (col/row)Yo'qHa O'lchamni boshqarishplt.subplots(figsize=...)Har bir facet uchun height= va aspect= Plot turini tanlashFunction ni tanlaysizkind="hist"/"kde"/"ecdf" Ko'p panelli dashboard da ishlatishHaYo'q

Qo'shimcha keyword argument lar to'g'ridan-to'g'ri asosdagi function ga uzatiladi, shuning uchun binwidth, stat, multiple, bw_adjust, element — hammasi displot da ishlaydi, agar ular siz tanlagan kind ga tegishli bo'lsa. kind="kde" bilan bins= berish TypeError chiqaradi.

python7 qator
g = sns.displot(data=tips, x="total_bill", col="time",
                kind="hist", binwidth=3, kde=True, height=4)

g.figure.suptitle("Bill distribution by service", y=1.03)   # plt.title() EMAS
g.set_axis_labels("Total bill ($)", "Count")
g.set_titles("{col_name}")
g.savefig("bills.png", dpi=150)
⚠️ `displot` dan keyin `plt.title()`

plt.title() joriy axes ning sarlavhasini o'rnatadi, facet qilingan displot dan keyin esa bu faqat oxirgi subplot bo'ladi. Figure sarlavhangiz pastki o'ng paneldagi joyga tushadi, yoki oradan boshqa narsa chizgan bo'lsangiz, bo'sh figure ga. Butun figure uchun g.figure.suptitle(...) dan, panellar uchun esa g.set_titles(...) dan foydalaning. Xuddi shu narsa plt.xlabel ga (g.set_axis_labels ishlating) va plt.savefig ga (g.savefig ishlating) ham tegishli. seaborn 0.12+ da g.figure dan foydalaning; eski g.fig hali ishlaydi, lekin u deprecated yozuv.

16.6 Guruhlarni solishtirish

Deyarli har bir real savol solishtiruvchi bo'ladi: Adelie va Gentoo penguin lari flipper length bo'yicha farq qiladimi; tushlik va kechki ovqat hisoblari farq qiladimi; omon qolganlar yoshi bo'yicha omon qolmaganlardan farq qildimi. Buning mexanizmi — hue=, va uni qanday sozlaganingiz solishtirish adolatli bo'lishini hal qiladi.

multiple= — to'rtta layout

python6 qator
fig, axes = plt.subplots(2, 2, figsize=(11, 7))
for ax, m in zip(axes.flat, ["layer", "dodge", "stack", "fill"]):
    sns.histplot(data=penguins, x="flipper_length_mm", hue="species",
                 multiple=m, binwidth=5, ax=ax)
    ax.set_title(f'multiple="{m}"')
plt.tight_layout()

layer ustma-ust qo‘yadi (o‘qish qiyin), stack umumiy miqdorni, fill esa ulushlarni ko‘rsatadi. Savolingizga mos kelganini tanlang.

QiymatLayoutNima uchun yaxshiQachon ishlamaydi

"layer" (default)Bar lar yarim shaffof holda bir-birining ustiga chiziladiKam kesishadigan 2 ta guruh3+ guruh: ustma-ust tushgan shaffof bar lar legend dagi hech bir yozuvga mos kelmaydigan loyqa ranglar hosil qiladi va qorong'i hudud bitta baland bar mi yoki uchta pastmi — ajratib bo'lmaydi. "dodge"Har bir bin ichida bar lar yonma-yon2–3 guruh, kam bin, har bir guruhning aniq balandligiBin lar ko'p bo'lganda: bar lar ingichka chiziqqa aylanadi va bin strukturasi yo'qoladi. "stack"Bar lar vertikal ravishda uyilganUmumiy miqdorni ham, uning tarkibini ham ko'rsatishGuruh shakllarini solishtirish — faqat pastki guruh tekis asosda turadi, qolganlarini o'qish qiyin. "fill"Uyilgan va har bir bin da 100% ga normalization qilingan"Shu oraliqdagi observation larning qancha ulushi Gentoo?"Sample hajmini butunlay yashiradi: 2 ta observation li bin 200 talik bin kabi ishonchli ko'rinadi.

⚠️ Uchta guruh bilan `multiple="layer"`

Default aynan yangi boshlovchilar birinchi duch keladigan holat uchun eng yomon tanlov. Uchta species qatlam qilinganda, uchalasi kesishgan hudud legend da umuman uchramaydigan rangda bo'ladi, oldingi guruhning ko'rinadigan balandligi esa uning count i emas. Buni uch usuldan biri bilan tuzating: kontur chizish uchun element="step", fill=False; aniq balandliklar uchun multiple="dodge"; yoki har bir guruhga alohida panel berish uchun col="species". 4+ guruh uchun faceting yoki KDE overlay — yagona o'qish mumkin bo'lgan variant.

Hajmi har xil guruhlar: normalization tuzog'i

Bu — talabalar ishida eng ko'p uchraydigan, sezilmay o'tib ketadigan xato.

python11 qator
penguins["species"].value_counts()
# Adelie 152, Gentoo 124, Chinstrap 68

# NOTO'G'RI: xom count lar. Chinstrap har qanday flipper length da "kam uchraydigan" ko'rinadi
sns.histplot(data=penguins, x="flipper_length_mm", hue="species",
             element="step", fill=False)

# TO'G'RI: har bir guruh o'z umumiy soniga normalizatsiya qilingan
sns.histplot(data=penguins, x="flipper_length_mm", hue="species",
             stat="density", common_norm=False,
             element="step", fill=False)

stat="count" bilan Chinstrap curve i hamma joyda past bo'ladi, chunki ular atigi 68 ta. Peak balandliklarini solishtirayotgan o'quvchi "Chinstrap flipper lari kamroq uchraydi" degan xulosaga keladi — bu esa penguin lar haqidagi emas, sampling haqidagi gap. Siz aslida bergan savol — "penguin Chinstrap ekani ma'lum bo'lsa, uning flipper length i qanday taqsimlangan?" — bu guruh ichidagi savol va u guruh ichidagi normalization ni talab qiladi.

QOIDAn lari teng bo'lmagan guruhlarning shaklini solishtirish: stat="density" (yoki "probability" / "percent") plus common_norm=False. Ikkalasi ham kerak. Yolg'iz stat="density" default common_norm=True bilan barcha guruhlarni birgalikda normalization qiladi, ya'ni hajm nomutanosibligi qayta masshtablashdan keyin ham saqlanib qoladi.
common_norm Ma'nosi Qaysi savolga javob beradi
True (default) Barcha guruhlar bitta normalization ni bo'lishadi; butun plot yig'indisi 1 "Barcha penguin larning qancha qismi ~215 mm flipper li Gentoo?" — guruh hajmi javobning bir qismi.
False Har bir guruh alohida normalization qilinadi; har birining yig'indisi 1 "Har bir species ichida flipper length qanday taqsimlangan?" — guruh hajmi hisobdan chiqarilgan.

Xuddi shu juftlik kdeplot ga ham tegishli: u yerda default common_norm=True uchta curve ostidagi yuzalar yig'indisi 1 bo'lishini bildiradi, har biri 1 bo'lishini emas — natijada kichik guruhning curve i o'z shakliga umuman aloqasi bo'lmagan sabab tufayli siqilib qoladi.

python2 qator
sns.kdeplot(data=penguins, x="flipper_length_mm", hue="species",
            common_norm=False, fill=True, alpha=0.35)
💡 Sample hajmlarini ko'rinadigan qilib qoldiring

Normalization qilganingizdan keyin plot endi n ni ko'rsatmaydi — n esa o'quvchiga notekis tail ga qanchalik ishonish kerakligini aytadigan narsa. Uni legend yozuvlariga yoki caption ga qo'ying: "Adelie (n=152), Gentoo (n=124), Chinstrap (n=68)". Normalization qilish — to'g'ri analitik tanlov; count larni butunlay yashirish esa yo'q.

Ustma-ust chizish o'rniga faceting

python3 qator
# overlay ishlamay qolganda ajrating — umumiy bin va umumiy o'qlar bilan
sns.displot(data=titanic, x="age", col="class", row="sex",
            binwidth=5, height=3, facet_kws={"sharey": True})

Faceting to'g'ridan-to'g'ri solishtirishni (qiyinroq — ko'z panellar orasida sakrashi kerak) aniqlikka (har bir distribution toza) almashtiradi. binwidth ni qat'iy va o'qlarni umumiy qoldiring, aks holda panellar har xil masshtabda chiziladi va ularni solishtirish ma'nosiz bo'ladi.

16.7 Ikki o'lchovli distribution lar

x va y ning ikkalasini ham bering — o'sha function larning o'zi bivariate rejimga o'tadi.

python9 qator
# 2D histogram: to'rtburchak kataklardagi count larning heatmap i
sns.histplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")

# 2D KDE: teng density li kontur chiziqlari
sns.kdeplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")

# bitta guruh uchun to'ldirilgan konturlar yaxshiroq o'qiladi
sns.kdeplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
            fill=True, thresh=0.05, levels=8, cmap="mako")

Bivariate histogram kataklarni count ga qarab qoraytiradi va bins/binwidth ni juftlik sifatida ishlatadi (binwidth=(2, 0.5) x va y ni alohida belgilaydi). Uning asosiy qo'llanilishi — scatter plot ustma-ust tushib ketadigan katta ma'lumot: 100 000 nuqtada scatter qora dog'ga aylanadi, 2D histogram esa massa qayerda ekanini hamon ko'rsatadi.

Bivariate KDE konturlarni chizadi, ularning har biri teng baholangan density ga ega hududni o'rab oladi. Foydali qo'shimcha parametrlar:

Parametr Ta'siri
levels Kontur chiziqlari soni, yoki [.05, .25, .5, .75] kabi iso-ulushlar ro'yxati.
thresh Chiziladigan eng past density, peak ga nisbatan ulush sifatida. Xira tashqi konturlarni olib tashlash uchun uni oshiring.
fill Chiziqlar o'rniga to'ldirilgan polosalar.
cbar True color bar qo'shadi (2D histplot da ham, to'ldirilgan kdeplot da ham).
hue Har bir guruh uchun alohida kontur to'plami. Taxminan uchta guruhgacha o'qish mumkin, keyin chalkashlikka aylanadi.
python11 qator
# har bir species uchun alohida kontur to'plami uchta aniq klasterni ochib beradi
sns.kdeplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
            hue="species", levels=5, thresh=0.1)

# jointplot: bitta chaqiruvda bivariate markaz va univariate chekkalar
sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
              hue="species", kind="kde")

# xuddi shu narsa figure-level distribution interface orqali
sns.displot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
            col="species", kind="hist", cbar=True)
⚠️ Kichik sample larda 2D KDE

Bivariate density estimate univariate ga qaraganda ancha ko'p ma'lumot talab qiladi — to'ldirilishi kerak bo'lgan fazo aniqlikning kvadratiga proporsional o'sadi. 68 ta Chinstrap penguin bilan konturlar silliq va ishonchli ko'rinadi, aslida esa asosan kernel ning artefakti bo'ladi. Ustiga scatter qo'shing (o'sha axes ga sns.scatterplot) yoki 2D histogram ishlating, shunda o'quvchi har bir konturni nechta nuqta qo'llab-quvvatlayotganini ko'ra oladi. Taxminiy mo'ljal sifatida: har bir guruhda bir necha yuzdan kam nuqta bo'lsa, 2D konturlarga shubha bilan qarang.

16.8 Tuzoqlar

1. KDE mavjud bo'lishi mumkin bo'lmagan qiymatlar borligini da'vo qiladi

Yuqorida ko'rib chiqilgan, lekin takrorlashga arziydi, chunki bu narx, yosh, davomiylik yoki count haqidagi deyarli har bir talaba hisobotida uchraydi. Gaussian kernel cheksiz supportga ega, shuning uchun qat'iy musbat o'zgaruvchi noldan pastda ham noldan farqli density oladi. cut=0, clip=(0, None) yoki log_scale=True bilan tuzating. Agar reviewer "tip miqdori" uchun density curve x=0 dan o'tib ketayotganini ko'rsa, u figure ning qolgan qismiga ham ishonishni to'xtatadi.

2. Bandwidth topilmani silliqlab yo'q qildi

Bimodal ma'lumotda default bandwidth bitta do'nglik hosil qilishi mumkin. "Distribution unimodal" deb yozishdan oldin har doim bw_adjust=0.5 bilan va histogram bilan tekshirib ko'ring.

3. Teng bo'lmagan guruhlar bo'ylab xom count lar

stat="density", common_norm=False. Ikkala qismi ham. Faqat bittasini qo'yish tuzatilgandek ko'rinadigan, aslida esa tuzatilmagan plot beradi.

4. Bir nechta guruh bilan multiple="layer"

Default uchta guruhda o'qib bo'lmaydigan, to'rttada esa chalg'ituvchi bo'lib qoladi. element="step", fill=False ga, dodge ga yoki facet larga o'ting.

5. displot dan keyin plt.title()

displot Axes emas, FacetGrid qaytaradi. g.figure.suptitle(), g.set_titles(), g.set_axis_labels(), g.savefig() dan foydalaning. Shuningdek, displot ax= ni qabul qilmaydi — agar mavjud subplot grid i ichida distribution kerak bo'lsa, histplot(..., ax=axes[0, 1]) ishlating.

6. NaN lar ovoz chiqarmasdan tashlab yuboriladi

penguins["flipper_length_mm"].isna().sum() # 2 ta yetishmayapti Seaborn yetishmayotgan qiymatlarni ogohlantirishsiz olib tashlaydi, shuning uchun "count" bar chart i aslida bo'sh bo'lmagan row lar soni. 344 tadan 2 tasi bo'lsa bu zararsiz; 40% i yetishmasa esa sizning "distribution" ingiz o'zi tanlagan subset ni tasvirlaydi. Chizishdan oldin, har safar, NaN sonini tekshiring.

7. Takrorlangan / yaxlitlangan qiymatlar silliq mode ga o'xshab ko'rinadi

Titanic yoshlari orasida .5 bilan qayd etilgan ko'plab taxminiy qiymatlar va ko'plab yaxlit sonlar bor. KDE bu cho'qqilarni mayin do'nglikka aylantiradi, o'quvchi esa aslida ma'lumot kiritish odati bo'lgan joyda tabiiy mode ko'radi. binwidth=1 li histogram yoki rug buni darhol fosh qiladi.

8. ECDF — halol variant, uni hakam sifatida ishlating

Unda sozlash parametri yo'qligi uchun ECDF ni chiroyliroq hikoyaga moslab bo'lmaydi. Agar histogram ingiz bilan KDE ingiz kelishmasa, bahsni ECDF hal qiladi: ikkita tik uchastka orasidagi tekis qism haqiqiy bimodallikni tasdiqlaydi; silliq S-shaklidagi curve esa ikkinchi mode artefakt bo'lganini aytadi.

9. sns.load_dataset() ga internet kerak

python10 qator
# seaborn-data GitHub repo sidan CSV yuklab oladi; offline da ishlamaydi
penguins = sns.load_dataset("penguins")

# offline yechim 1: bir marta cache qilib, keyin lokal o'qish
# penguins.to_csv("penguins.csv", index=False)
import pandas as pd
penguins = pd.read_csv("penguins.csv")

# offline yechim 2: seaborn ni seaborn-data ning lokal nusxasiga yo'naltirish
penguins = sns.load_dataset("penguins", data_home="./seaborn-data", cache=True)

Birinchi muvaffaqiyatli chaqiruvda seaborn faylni ~/seaborn-data ostiga cache qiladi, shuning uchun keyingi chaqiruvlar offline ishlaydi — lekin imtihon zalidagi yoki cheklangan mashinadagi birinchi chaqiruv URL xatosi beradi. Dataset larni oldindan bir marta yuklab oling yoki notebook bilan birga CSV larni ham bering.

10. Legend bilan ishlash level larda har xil

histplot legend ni axes ga qo'yadi va uni ax.legend_.set_title(...) yoki matplotlib chaqiruvlari bilan siljitish mumkin; displot esa grid tashqarisiga bitta figure legend joylashtiradi va u legend=False yoki g.legend orqali boshqariladi. Seaborn plot idan keyin plt.legend() ga murojaat qilish odatda seaborn ning legend ini bo'sh yoki noto'g'ri legend bilan almashtirib yuboradi.

16.9 Mashqlar to'plami

python44 qator
# Setup
import seaborn as sns
import matplotlib.pyplot as plt
penguins = sns.load_dataset("penguins")
tips     = sns.load_dataset("tips")
titanic  = sns.load_dataset("titanic")

# 1. Oddiy histogram.
#    penguins dagi body_mass_g distribution ini default bin lar bilan chizing.
#    Bitta gap yozing: u simmetrikmi, o'ngga skew qilganmi yoki chapgami?

# 2. Bin lar hikoyani o'zgartiradi.
#    flipper_length_mm ni bins = 3, 12, 30, 120 bilan yonma-yon to'rt marta chizing.
#    Qaysi panellarda ikkita mode ko'rinadi? Qaysi bin sonini chop etardingiz va nega?

# 3. binwidth bins dan ustun.
#    2-mashqni binwidth=2 va binwidth=8 bilan qaytadan chizing.
#    Bir qatorda tushuntiring: nega caption da binwidth ni asoslash osonroq.

# 4. stat o'qi.
#    tips dagi total_bill ni bir xil binwidth bilan stat="count", "probability",
#    "percent", "density" da chizing. Shakl hech qachon o'zgarmasligini tasdiqlang
#    va stat="density" da 0.03 soni nimani anglatishini ayting.

# 5. Bandwidth.
#    flipper_length_mm ning to'rtta KDE sini bw_adjust = 0.25, 0.5, 1, 2 bilan ustma-ust chizing.
#    Qaysi qiymatda bimodallik yo'qoladi?

# 6. Chegara muammosi.
#    tips["tip"] ning KDE si default lar bilan. Curve noldan pastga tushadimi?
#    cut=0 bilan, keyin clip=(0, None) bilan qayta chizing va farqni tasvirlang.

# 7. Adolatli guruh solishtirish.
#    flipper_length_mm ni species bo'ylab avval xom count lar bilan,
#    keyin stat="density" + common_norm=False va element="step" bilan solishtiring.
#    Qaysi xulosa o'zgaradi va nega birinchi variant chalg'ituvchi edi?

# 8. Hammasini birlashtiring.
#    titanic dan foydalanib: age ni class (column lar) va survived (row lar) bo'yicha
#    displot bilan facet qiling, binwidth=5, umumiy y o'qi. Figure ga
#    g.figure.suptitle() bilan sarlavha bering. Keyin shunga ekvivalent ecdfplot ni
#    hue="class" bilan bitta axes da chizing va ikkalasidan qaysi birini
#    texnik bo'lmagan auditoriyaga ko'rsatishingizni, qaysi birini esa
#    o'zingiz ishlatishingizni ayting.

16.10 Intervyu savollari

S: sns.distplot() o'rniga nima keldi va u nega olib tashlandi?

U 0.11 da deprecated qilingan va 0.14 da olib tashlangan. U histogram, KDE va rug ni bitta function da birlashtirar, default lari esa y o'qining ma'nosini ovoz chiqarmasdan o'zgartirar edi — KDE ni yoqish bar larni count dan density ga o'tkazib yuborardi. Uning o'rnini histplot (axes-level histogram), kdeplot (density), ecdfplot (cumulative) va displot (kind= li figure-level wrapper) egalladi. sns.distplot(x) ning so'zma-so'z ekvivalenti — sns.histplot(x, kde=True, stat="density").

S: Bin sonini qanday tanlaysiz?

Yagona to'g'ri javob yo'q; bin soni — bias bilan variance ni almashtiradigan silliqlash parametri. Bin lar juda kam bo'lsa haqiqiy xususiyatlar yashirinadi, juda ko'p bo'lsa sampling noise ko'rinadi. Seaborn ning bins="auto" si NumPy qoidasidan foydalanadi — Freedman–Diaconis va Sturges dan kengrog'i — va u density silliq hamda taxminan unimodal deb faraz qiladi, ya'ni aynan plot eng kerak bo'lgan paytda buziladigan farazdan. Amalda: default ni, uning yarmini va ikki barobarini chizing, uchalasida ham saqlanib qolgan xususiyatlarnigina qoldiring, tushunarli va facet lar bo'ylab barqaror bo'lgani uchun binwidth ni afzal ko'ring va caption da bin width ni yozib qo'ying.

S: Buyurtma summasining KDE si manfiy narxlarda density ko'rsatyapti. Sababini tushuntiring va tuzating.

KDE har bir observation ga Gaussian kernel qo'yadi, Gaussian esa cheksiz supportga ega, shuning uchun nolga yaqin observation lar massani manfiy hududga yoyadi. Keyin cut=3 curve ni eng kichik ma'lumot nuqtasidan uchta bandwidth naridagi masofagacha chizadi va bu ko'zga tashlanadi. Bundan tashqari, estimator chegara yaqinida bias li bo'ladi va haqiqiy chekkadagi density ni kamaytirib ko'rsatadi. Yechimlar: ma'lumotdan naridagi qismni chizmaslik uchun cut=0, fizik chegarani qo'yish uchun clip=(0, None), musbat va skew qilingan o'zgaruvchi uchun log_scale=True, yoki shunchaki histogram — u observation bo'lmagan joyga bar qo'ya olmaydi.

S: Qachon histogram o'rniga ECDF ni afzal ko'rasiz?

Aniqlik intuitiv shakldan muhimroq bo'lganda. ECDF da bin ham, bandwidth ham yo'q, shuning uchun u to'liq takrorlanuvchi va biror xulosa foydasiga sozlab bo'lmaydi; quantile va median lar to'g'ridan-to'g'ri o'qiladi; ikkita guruhni har bir nuqtada aniq solishtirish mumkin — kesishmaydigan ECDF lar bitta guruh hamma joyda stoxastik jihatdan kattaroq ekanini bildiradi, bu esa o'rtachalar farqidan kuchliroq. Shuningdek, u ustma-ust chizilgan histogram ga qaraganda ko'proq guruh bilan ishlata oladi. Almashuv shundaki, mode va skew ni keng auditoriya ko'rishi ancha qiyin, shuning uchun taqdimot uchun histogram yaxshiroq bo'lib qoladi.

S: 5000, 500 va 50 ta row li uchta guruhni solishtiryapsiz. Nima o'rnatasiz?

stat="density" (yoki "probability") ni common_norm=False bilan birga, shunda har bir guruhning distribution i o'z umumiy soniga normalization qilinadi va solishtirish sample hajmi haqida emas, shakl haqida bo'ladi. Ikkala qism ham shart: default common_norm=True da normalization guruhlar bo'ylab umumiy bo'ladi va nomutanosiblik saqlanib qoladi. Bar lar solishtirsa bo'ladigan bo'lishi uchun common_bins=True ni ham qoldirardim, legend da n qiymatlarini ko'rsatardim va 50 ta row li guruhga ehtiyotkorlik bilan qarardim — uning tail lari noise, uning KDE si esa 5000 talik guruhniki kabi silliq va ishonchli ko'rinadi.

S: histplot bilan displot orasidagi farq nima?

histplot axes-level: u joriy yoki berilgan Axes ga chizadi, ax= ni qabul qiladi, Axes qaytaradi va har qanday matplotlib figure ining tarkibiga kiradi. displot figure-level: u figure yaratadi va unga egalik qiladi, FacetGrid qaytaradi, ax= ni qabul qilmaydi, col=/row= faceting ni va height=/aspect= o'lchamlashni qo'llab-quvvatlaydi hamda kind= orqali hist, kde va ecdf o'rtasida almashina oladi. Facet qilingan mustaqil figure lar uchun displot ni, plot kattaroq layout ning bitta paneli bo'lganda esa histplot ni ishlating.

S: displot dan keyin plt.title() sarlavhani noto'g'ri panelga qo'yadi. Nega?

plt.title() joriy axes ni nishonga oladi, facet qilingan displot dan keyin esa bu oxirgi chizilgan subplot bo'ladi. Figure sarlavhasi uchun g.figure.suptitle("...") dan, panel sarlavhalari uchun g.set_titles("{col_name}") dan, shuningdek g.set_axis_labels() va g.savefig() dan foydalaning. Umumiy qoida: figure-level function lar grid obyektini qaytaradi va siz pyplot state machine orqali emas, o'sha obyekt orqali ishlashingiz kerak.

S: multiple="layer" qachon yomon default bo'ladi va uning o'rniga nima ishlatasiz?

Uchta yoki undan ko'p hue guruhi bo'lishi bilanoq, yoki guruhlar kuchli kesishganda. Shaffof bar lar legend da umuman uchramaydigan ranglarga qo'shilib ketadi, oldingi guruhning ko'rinadigan balandligi esa uning count i emas. Alternativalar: kontur uchun element="step", fill=False; har bir guruhning aniq balandligi muhim bo'lib, bin lar kam bo'lganda multiple="dodge"; umumiy miqdorning o'zi maqsad bo'lgandagina multiple="stack"; uch-to'rtta guruhdan oshganda esa col= bilan faceting. Silliqlashni asoslay olsangiz, common_norm=False li ustma-ust KDE lar ham toza variant.

16.11 Xulosa

  • distplot olib tashlangan; axes level da histplot, kdeplot, ecdfplot, figure level da esa displot(kind=...) ishlating.
  • Bin soni — sozlama emas, silliqlash parametri: bir xil ma'lumot unga qarab unimodal yoki bimodal ko'rinishi mumkin. Bir nechtasini sinab ko'ring, saqlanib qolganini oling, binwidth ni afzal ko'ring va uni caption da yozib qo'ying.
  • stat= faqat y o'qining ma'nosini o'zgartiradi — "count", "probability", "percent" bar lar bo'ylab yig'iladi; "density" esa yuzani 1 ga tenglashtiradi.
  • KDE bandwidth i (bw_adjust) — bu niqoblangan histogram bin width i; default haqiqiy bimodallikni silliqlab yo'q qilishi mumkin, shuning uchun har doim solishtirib tekshiring.
  • KDE ma'lumot yo'q joyda, jumladan fizik chegaralardan tashqarida ham density o'ylab topadi — cut=0, clip= yoki log_scale=True bilan tuzating.
  • ECDF da sozlash parametri yo'q, shuning uchun u eng halol variant va histogram bilan KDE kelishmaganda eng yaxshi hakam; KDE ostidagi rug plot esa ma'lumot aslida qayerda ekanini ko'rsatadi.
  • Teng bo'lmagan guruhlarni solishtirish stat="density" va common_norm=False ni talab qiladi; common_bins=True ni qoldiring va n qiymatlarini yozib bering.
  • multiple="layer" uchta yoki undan ko'p guruhda buziladi — element="step", dodge yoki facet larni ishlating.
  • displot FacetGrid qaytaradi: g.figure.suptitle(), g.set_titles(), g.savefig() dan foydalaning va u ax= ni qabul qilmasligini yodda tuting.

Keyingisi: 17-bob categorical plot lar haqida — bar, box, violin, strip va swarm.

Bu bobni bepul o'qidingiz.

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

Telegramda yozish Narxlar