Asosiy qismga o'tish

Seaborn asoslari

14-bob 8 kod bloki 2801 so'z

I qism DataFrame bilan yakunlangan edi. II qism esa o'sha DataFrame ni inson bir qarashda tushuna oladigan narsaga aylantiradi.

Bu bob mental model quradi — Seaborn nima, u matplotlib bilan qanday bog'liq, qanday data shape ni talab qiladi va uning butun function library si qanday tuzilgan. Shu to'rt narsani to'g'ri o'zlashtirsangiz, undan keyingi barcha boblar shunchaki parameter lardan iborat bo'lib qoladi.

Seaborn nima?

Seaborn — statistik data visualisation uchun mo'ljallangan Python library si; u matplotlib ustiga qurilgan va to'g'ridan-to'g'ri pandas DataFrame lari bilan ishlash uchun yaratilgan.

U sizga amalda beradigan uchta narsa:

  1. U DataFrame tilida gapiradi. Siz data=df ni uzatasiz va column larga nomi bo'yicha murojaat qilasiz: x="total_bill". Seaborn column ni o'qiydi, axis ni o'sha nom bilan belgilaydi va mos scale ni tanlaydi. Matplotlib da esa array larni o'zingiz ajratib olasiz va hamma yorliqni o'zingiz yozasiz.
  2. U statistikani siz uchun bajaradi. Bitta call mean va confidence interval ni, yoki kernel density estimate ni, yoki linear fit ni hisoblab, natijani chizib beradi. Matplotlib da avval bularni hisoblab, keyin chizasiz.
  3. Uning didi bor. Rang lar, oraliqlar, gridline lar va shrift lar default holda o'qishga qulay bo'lishi uchun tanlangan — tasodifan emas.
🧩 O'xshatish

Matplotlib — bu rassomlik anjomlari solingan quti: qalam, chizg'ich, bo'yoq. Undan hohlagan narsani chizsangiz bo'ladi, lekin har bir chiziqni o'zingiz tortasiz. Seaborn esa o'sha anjomlardan yasalgan, puxta o'ylangan shablonlar to'plami — siz "kunlar bo'yicha tips ning box plot i" deysiz, qolganini u bajaradi. Anjomlar hamon qutida turibdi, shuning uchun shablon qamrab olmagan narsani baribir qo'lda chizishingiz mumkin.

Seaborn va matplotlib

Talabalar ko'pincha ulardan birini tanlash kerak deb o'ylashadi. Aslida bunday emas — Seaborn bu matplotlib. Har bir Seaborn function i matplotlib object larini yaratadi va deyarli har bir real plot ni siz bir nechta matplotlib call i bilan yakunlaysiz.

Bir xil chart, ikki xil yo'l bilan:

python13 qator
# matplotlib: grouping, joylashtirish va yorliqlarni o'zingiz qilasiz
import matplotlib.pyplot as plt

means = tips.groupby("day")["total_bill"].mean()
plt.bar(means.index, means.values)
plt.xlabel("day")
plt.ylabel("total_bill")
plt.title("Average bill by day")

# seaborn: bitta qator, error bar lar esa tekinga keladi
import seaborn as sns

sns.barplot(data=tips, x="day", y="total_bill")

matplotlibSeaborn

Kirish ma'lumotiArray / list larDataFrame + column nomlari Axis yorliqlariO'zingiz yozasizColumn nomlaridan olinadi StatistikaAvval o'zingiz hisoblaysizCall ning ichida hisoblanadi Category bo'yicha groupingLoophue= Default ko'rinishOddiyO'ylangan NazoratTo'liqYuqori, ostida matplotlib bilan Nima uchun eng mosG'ayrioddiy har qanday narsaStandart statistik chart lar

:::info 📌 Ish taqsimoti Seaborn chart ni chizadi; matplotlib uni yakunlaydi. Real plot — bu bitta Seaborn call i, undan keyin plt.title(), plt.xticks(rotation=45) va plt.savefig(). Bu normal pattern, Seaborn ning kamchiligi emas. :::

O'rnatish va import qilish

`pip install seaborn # matplotlib, pandas va numpy ni o'zi bilan olib keladi

conda install seaborn`

python6 qator
import seaborn as sns              # universal alias
import matplotlib.pyplot as plt
import pandas as pd

sns.set_theme(style="whitegrid")   # Seaborn styling ini qo'llash (21-bob)
print(sns.__version__)             # tekshiring: bu qo'llanma 0.12+ ni nazarda tutadi
Chiqish
0.13.2

:::gotcha ⚠️ Bu yerda version odatdagidan ko'ra muhimroq Seaborn 0.12 versiyasida jiddiy o'zgardi. Eski darsliklar hanuz sns.distplot() ni ko'rsatadi — u olib tashlangan, o'rniga histplot/kdeplot/displot keldi — va ci=95 ham deprecated bo'lib, o'rniga errorbar=("ci", 95) ishlatiladi. Agar talabaning kodi "unexpected keyword argument" xatosini bersa, demak darslik uning library sidan eskiroq. Avval doim sns.__version__ ni tekshiring. :::

💡 Nega `sns`?

Bu — qolib ketgan hazil: library The West Wing serialidagi Samuel Norman Seaborn ismli qahramon sharafiga atalgan. Talabalar buni doim so'rashadi, endi bilib qo'ydingiz.

Tidy data — eng muhim yagona qoida

Yangi boshlovchi duch keladigan deyarli har bir Seaborn muammosi aslida data shape muammosidir. Seaborn long (tidy) format ni kutadi:

Tidy data qoidasiHar bir row = bitta kuzatuv Har bir column = bitta o'zgaruvchi Har bir cell = bitta qiymat

Bir xil ma'lumotni ikkala shakl da solishtiring:

Wide format — inson uchun qulay, Seaborn uchun noto'g'ri:

student math physics english
Aziza 92 88 95
Bekzod 75 64 70

Long format — Seaborn xohlaydigan shakl:

student subject score
Aziza math 92
Aziza physics 88
Aziza english 95
Bekzod math 75
Bekzod physics 64
Bekzod english 70

Long variantda "subject" haqiqiy column — shuning uchun hue="subject" deb yozish mumkin. Wide variantda esa bunday column yo'q, faqat uchta column nomi bor va hue= ga beradigan hech narsa qolmaydi. Butun qiyinchilik ana shunda.

`# wide → long long_df = wide_df.melt(id_vars="student", var_name="subject", value_name="score")

long → wide (heatmap uchun, 18-bob)

wide_df = long_df.pivot(index="student", columns="subject", values="score"):::info 📌 Nega I qism behuda ketmadi Normalization qilingan database ni JOIN qilsangiz, natija **avtomatik** long format bo'lib chiqadi — har bir enrollment uchun bitta row, column lar esa student, course va grade. Bu aynan Seaborn talab qiladigan shakl. Sizning SQL query ingiz reshaping ishini allaqachon bajarayotgan bo'ladi;melt` faqat ma'lumot spreadsheet dan kelganda kerak bo'ladi.

Agar database dagi ma'lumotingiz wide bo'lsa ham, 9-bobdagi UNION ALL unpivot xuddi shu ishni Python ga yetib bormasidan oldin bajaradi. :::

⚠️ Heatmap — istisno

sns.heatmap() — wide ma'lumotni, ya'ni matritsani talab qiladigan yagona function. Qolgan hammasi long ni kutadi. Talabalar "seaborn ketma-ket emas" deganda, odatda aynan shuni nazarda tutishadi; buni 18-bobdan keyin emas, oldin aytib qo'ygan ma'qul.

Ichki dataset lar

Seaborn namunaviy dataset lar bilan keladi, shuning uchun ma'lumot qidirib yurmasdan dars o'tishingiz mumkin.

python7 qator
tips     = sns.load_dataset("tips")        # 244 ta restoran hisobi
penguins = sns.load_dataset("penguins")    # 344 ta pingvin, 3 ta species
titanic  = sns.load_dataset("titanic")     # 891 ta yo'lovchi
flights  = sns.load_dataset("flights")     # oylik yo'lovchilar 1949-1960
iris     = sns.load_dataset("iris")        # klassik 150 ta gul

print(sns.get_dataset_names())             # to'liq ro'yxat
Chiqish
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'dowjones', 'exercise', 'flights', 'fmri', 'geyser', 'glue', 'healthexp', 'iris', 'mpg', 'penguins', 'planets', 'seaice', 'taxis', 'tips', 'titanic']

DatasetRow larNimani o'rgatishga qulay

tips244Category lar + sonlar: bill, tip, day, sex, smoker, party size penguins344Distribution lar va klasterlar; haqiqiy NaN lar bor titanic891Binary natijalar, yetishmayotgan ma'lumot, logistic regression flights144Time series, mavsumiylik va pivot qilingandan keyin heatmap lar iris150pairplot va bir-biridan ajraladigan guruhlar

:::gotcha ⚠️ load_dataset() internetdan yuklab oladi U har safar GitHub dan olib keladi va library ning ichiga joylanmagan. Internet ishonchli bo'lmagan sinfxonada har bir misol birinchi qatordayoq ishlamay qoladi.

Offline nusxalarni uyda, bir marta tayyorlab qo'ying:

python8 qator
# internet BOR joyda bir marta ishga tushiring
import seaborn as sns
for name in ["tips", "penguins", "titanic", "flights", "iris"]:
    sns.load_dataset(name).to_csv(f"data/{name}.csv", index=False)

# keyin darsda internet kerak bo'lmaydi
import pandas as pd
tips = pd.read_csv("data/tips.csv")

II qismdagi qolgan hamma narsa xuddi shunday ishlayveradi — DataFrame ikkala holatda ham bir xil. :::

Birinchi plot laringiz

Eng minimal ishlaydigan Seaborn call i bitta qatordan iborat:

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

tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip")
plt.show()

Bitta qator kod: sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time"). Legend avtomatik chiqadi.

Argument larni gap sifatida o'qing: "scatter plot, tips ma'lumotidan foydalanib, pastda total_bill, yon tomonda tip." Har bir Seaborn function i shu pattern ga amal qiladi, shuning uchun birinchisini o'rgansangiz, qolganlarining ko'pini ham bilib olasiz.

Uchinchi o'zgaruvchini qo'shish uchun bitta so'z yetadi:

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time") Endi tushlik va kechki ovqat har xil ranglarda chiziladi va legend avtomatik paydo bo'ladi. Siz na loop, na rang ro'yxati, na legend kodini yozdingiz.

Real, taqdimotga tayyor plot — II qism davomida ishlatiladigan pattern:

python12 qator
sns.set_theme(style="whitegrid")          # 1. styling
plt.figure(figsize=(9, 5))                # 2. o'lcham (matplotlib)

sns.scatterplot(data=tips, x="total_bill", y="tip",
                hue="time", size="size", alpha=0.7)   # 3. plot ning o'zi

plt.title("Tip vs total bill")            # 4. yakunlash (matplotlib)
plt.xlabel("Total bill (USD)")
plt.ylabel("Tip (USD)")
plt.tight_layout()
plt.savefig("tips.png", dpi=300, bbox_inches="tight")   # 5. show DAN OLDIN saqlang
plt.show()

:::gotcha ⚠️ Ko'rsatishdan oldin saqlang plt.show() joriy figure ni tozalab yuboradi. Undan keyin plt.savefig() ni chaqirsangiz, bo'sh rasm yoziladi — hech qanday xato xabarisiz. Har doim avval saqlang, keyin ko'rsating. Bunga hamma bir marta tushadi. :::

Barcha Seaborn function larining xaritasi

Seaborn ning ~25 ta plotting function i ko'p bo'lib tuyuladi — ular to'rtta oilaga bo'linishini va har birining tepasida bitta figure-level function turishini ko'rmaguningizcha.

Butun library bitta diagrammadaRELATIONAL → relplot() → scatterplot, lineplot DISTRIBUTION → displot() → histplot, kdeplot, ecdfplot, rugplot CATEGORICAL → catplot() → barplot, countplot, boxplot, violinplot, boxenplot, stripplot, swarmplot, pointplot REGRESSION → lmplot() → regplot, residplot MATRIX → heatmap, clustermap (wide data) GRIDS → pairplot, jointplot, FacetGrid, PairGrid, JointGrid
Savolingiz Oila Bob
Ikkita son bir-biri bilan qanday bog'liq? Relational 15
Bitta son qanday tarqalgan? Distribution 16
Son category lar orasida qanday farq qiladi? Categorical 17
Ko'p sonlar bir vaqtning o'zida bir-biri bilan qanday bog'liq? Matrix 18
Trend bormi, u qanchalik kuchli? Regression 19
Pattern har bir kichik guruhda ham saqlanadimi? Grids 20
💡 Function ni emas, savolni o'rgating

Function nomlarini yodlagan talaba real dataset oldida qotib qoladi. "Men qaysi savolga javob bermoqchiman?" deb so'ragan talaba esa yuqoridagi jadvaldan kerakli function ni bir necha soniyada topadi. O'sha jadvalni devorga osib qo'ying.

Axes-level va figure-level

Bu farq Seaborn ning chalkash xatti-harakatlarini boshqa hamma narsadan ko'ra ko'proq tushuntiradi, shuning uchun u bilan 20-bobda emas, hozir tanishing.

Axes-level Figure-level
Misollar scatterplot, histplot, boxplot, regplot relplot, displot, catplot, lmplot
Qayerga chizadi Mavjud bitta Axes ga O'zining yangi figure iga
Nimani qaytaradi matplotlib Axes Seaborn Grid
ax= ni qabul qiladimi Ha Yo'q
col=/row= bilan facet qila oladimi Yo'q Ha
O'lchamni boshqarish plt.figure(figsize=...) height=, aspect=
Sarlavha plt.title() g.figure.suptitle()
python8 qator
# axes-level: o'zingiz boshqaradigan matplotlib layout ga joylashadi
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sns.histplot(data=tips, x="total_bill", ax=axes[0])
sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1])

# figure-level: butun figure ni egallaydi, lekin column bo'yicha bo'lib chiza oladi
g = sns.relplot(data=tips, x="total_bill", y="tip", col="time", height=4)
g.figure.suptitle("Tips by service", y=1.03)

:::gotcha ⚠️ Talabalar aytadigan ikkita alomat - "Sarlavham faqat oxirgi panelda chiqdi." Siz figure-level plot da plt.title() ni ishlatdingiz. U joriy Axes ga, ya'ni oxirgi subplot ga sarlavha qo'yadi. g.figure.suptitle() dan foydalaning. - "figsize hech narsa qilmadi." Figure-level function lar o'z figure ini quradi va plt.figure(figsize=...) ni e'tiborsiz qoldiradi. Uning o'rniga height= va aspect= ni ishlating — kenglik height × aspect ga teng. :::

💡 Qaysi birini tanlash kerak

Default holda axes-level function dan foydalaning — u matplotlib bilan birga quriladi va dashboard larga joylashadi. col= yoki row= faceting kerak bo'lgan zahoti figure-level ga o'ting; bu — axes-level function lar qila olmaydigan yagona narsa.

hue, size, style — semantic mapping

Seaborn ning eng kuchli g'oyasi rasmiy nomga ega: semantic mapping — data column ini vizual xususiyatga biriktirish.

Parameter Vizual xususiyat Nima uchun eng mos
hue= Rang Category lar yoki uzluksiz qiymat
size= Marker o'lchami / chiziq qalinligi Uzluksiz miqdor
style= Marker shakli / chiziq punktiri Bir nechta category (2–4)
col=, row= Alohida panel lar Category lar, ustma-ust tushish chalkashtirsa
python6 qator
# bitta chart da to'rtta o'zgaruvchi — faceting bilan yana bittasi qo'shilib beshta bo'ladi
sns.relplot(data=tips,
            x="total_bill", y="tip",     # 1 va 2: pozitsiya
            hue="day",                   # 3: rang
            size="size",                 # 4: nuqta o'lchami
            col="time")                  # 5: panel

:::gotcha ⚠️ Qila olishingiz — qilish kerak degani emas Beshta o'zgaruvchini kodlagan chart odatda o'qib bo'lmaydigan bo'ladi. Pozitsiya (x va y) — o'quvchi uchun eng aniq kanal; undan keyin rang keladi; o'lcham esa haqiqatan ham yomon ishlaydi — odam yuzani yaxshi baholay olmaydi. Amalda bitta chart ga ikki yoki uchta o'zgaruvchi chegara hisoblanadi. Undan ortig'i uchun faceting ni (20-bob) ishlating: u o'quvchiga tiqilinch legend ni yechish o'rniga panel lar bo'ylab pozitsiyalarni solishtirish imkonini beradi. :::

⚠️ Uzluksiz column da `hue`

hue= ga numeric column bersangiz, Seaborn categorical legend o'rniga uzluksiz colourbar ga o'tadi. Bu to'g'ri xatti-harakat, lekin agar column aslida sonlar ko'rinishida saqlangan category bo'lsa (1–5 oralig'idagi rating, course_id), avval uni o'zgartiring — df["rating"].astype(str) yoki astype("category") — aks holda ma'nosiz gradient olasiz.

Keng tarqalgan xatolar

Xato Nima sodir bo'ladi Yechim
Long format kutadigan function ga wide ma'lumot berish Noto'g'ri chart yoki xato Avval df.melt(...)
heatmap ga long ma'lumot berish Xato yoki ma'nosiz natija Uni pivot qilib matritsaga aylantiring
plt.show() dan keyin plt.savefig() Bo'sh rasm, xatosiz Avval saqlang, keyin ko'rsating
Figure-level plot da plt.title() Faqat oxirgi panelga sarlavha qo'yiladi g.figure.suptitle()
relplot bilan plt.figure(figsize=) E'tiborsiz qoldiriladi height=, aspect=
sns.distplot() dan foydalanish 0.12+ da olib tashlangan histplot / kdeplot / displot
ci=95 dan foydalanish Deprecated ogohlantirishi errorbar=("ci", 95)
DataFrame o'rniga numpy array uzatish Axis lar yorliqlarini yo'qotadi data=df va column nomlarini uzating
Darsda internet yo'q load_dataset() ishlamaydi CSV larni oldindan saqlab qo'ying
Bir vaqtda beshta o'zgaruvchini kodlash O'qib bo'lmaydi Uning o'rniga facet qiling

Intervyu savollari

S: Seaborn nima va u matplotlib bilan qanday bog'liq?

Bu — matplotlib ustiga qurilgan statistik visualisation library si. U DataFrame bilan ishlaydigan plotting ni, ichki statistik baholashni va yaxshiroq default larni qo'shadi, lekin u yaratadigan har bir object matplotlib object idir, shuning uchun ikkalasi bir-biriga muqobil emas, balki birga ishlatiladi.

S: Seaborn qanday data format ni kutadi?

Long (tidy) format: har bir kuzatuvga bitta row, har bir o'zgaruvchiga bitta column. Istisno — heatmap, unga wide matritsa kerak. melt() va pivot() bilan o'zgartiriladi.

S: Axes-level va figure-level function o'rtasida qanday farq bor?

Axes-level function lar mavjud bitta Axes ga chizadi, ax= ni qabul qiladi va Axes qaytaradi. Figure-level function lar o'z figure ini yaratadi, Grid object qaytaradi, col=/row= faceting ni qo'llab-quvvatlaydi va figsize= o'rniga height=/aspect= ni oladi.

S: Nega catplot da plt.title() ishlamadi?

Chunki catplot figure-level. plt.title() joriy Axes ga — ya'ni oxirgi subplot ga sarlavha qo'yadi. g.figure.suptitle() dan foydalaning.

S: hue, size va style nima qiladi?

Ular data column ini mos ravishda rangga, marker o'lchamiga va marker/chiziq style iga map qiladi. Bu semantic mapping deb ataladi va chart ga uchinchi yoki to'rtinchi o'zgaruvchini shu tarzda qo'shasiz.

S: Bitta chart nechta o'zgaruvchini kodlashi kerak?

Amalda ikki yoki uchta. Pozitsiya eng aniq idrok etiladigan kanal, undan keyin rang, o'lcham esa yomon. Uchtadan ortig'ini small multiples ga facet qiling.

S: distplot o'rniga nima keldi?

Axes level da histplot, kdeplot va ecdfplot, figure-level kirish nuqtasi sifatida esa displot. distplot 0.12 da olib tashlangan.

S: Saqlangan PNG faylingiz bo'sh chiqdi. Nega?

plt.savefig() figure ni tozalaydigan plt.show() dan keyin chaqirilgan. Ko'rsatishdan oldin saqlang.

Xulosa

  • Seaborn — bu statistika va didi bor matplotlib. U DataFrame larni column nomi bo'yicha o'qiydi, baholashlarni siz uchun hisoblaydi va qo'lda yakunlashingiz mumkin bo'lgan matplotlib object larini qaytaradi.
  • Long (tidy) format — asosiy qoida: har bir kuzatuvga bitta row, har bir o'zgaruvchiga bitta column. heatmap yagona istisno va u wide matritsani xohlaydi.
  • Normalization qilingan database ning JOIN i allaqachon long format beradi — I qism reshaping ishini siz uchun bajarib qo'ygan.
  • load_dataset() uchun internet kerak. Dars uchun CSV larni oldindan saqlab qo'ying.
  • To'rtta oila — relational, distribution, categorical, regression — hamda matrix va grids. Function nomi bo'yicha emas, savol bo'yicha tanlang.
  • Axes-level (scatterplot, boxplot) ax= ni qabul qiladi va matplotlib bilan birga quriladi. Figure-level (relplot, catplot) o'z figure iga egalik qiladi, col=/row= ni qo'llab-quvvatlaydi va g.figure.suptitle() hamda height=/aspect= ni talab qiladi.
  • hue, size, style, col, row column larni vizual xususiyatlarga map qiladi — lekin o'qish uchun qulay chegara bitta chart ga ikki yoki uchta o'zgaruvchi.
  • Ko'rsatishdan oldin saqlang, aks holda bo'sh fayl olasiz.
  • sns.__version__ ni tekshiring: bu qo'llanma 0.12+ ni nazarda tutadi, unda distplot yo'q va ci= errorbar= ga aylangan.

Keyingisi: 15-bob relational plot lar bilan boshlanadi — scatterplot, lineplot va relplot.

Bu bobni bepul o'qidingiz.

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

Telegramda yozish Narxlar