aidoc.uz

4-qism · Ma'lumotlar bilan ishlash·21-bob

Vizualizatsiya: Matplotlib va Seaborn

Figure va Axes modeli, chiziq, nuqta, gistogramma va ustunli grafiklar, subplots, o'qitish egri chiziqlari, Pandas va Seaborn bilan tezkor grafiklar, to'g'ri grafik turini tanlash va keng tarqalgan xatolar.

Raqamlar jadvali sizga nima borligini aytadi; grafik esa nima bo'layotganini ko'rsatadi. 20-bobda describe() "o'rtacha narx mediandan katta" dedi — gistogramma buni bir qarashda ko'rsatadi. O'qitish loss'i jadvalda shunchaki sonlar; grafikda — overfitting qaysi epoch'dan boshlanganini darhol ko'rasiz. ML muhandisi uchun vizualizatsiya — chiroyli hisobot emas, diagnostika vositasi.

uv add matplotlib seaborn
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
▶ Video dars· Corey Schafer· 35:01· ingliz tilida
Matplotlib Tutorial (Part 1): Creating and Customizing Our First Plots

Matplotlib'da birinchi grafiklar: chiziqlar, sarlavhalar, legenda va uslublar.

YouTube'da ochish ↗

1. Matplotlib'ning ikki qatlami: Figure va Axes#

Matplotlib'da ikkita asosiy obyekt bor va ularni farqlash — hamma chalkashliklarning yechimi:

Figure
butun "varaq" — o'lcham, saqlash, umumiy sarlavha
Axes (bir yoki bir nechta)
bitta grafik maydoni: chiziqlar, o'qlar, legenda, sarlavha
Artist'lar
chiziq, nuqta, matn, ustun — Axes ichidagi har bir element

Ikki uslub bor:

# 1. "pyplot" uslubi — tez, lekin global holatga tayanadi
plt.plot([1, 2, 3], [1, 4, 9])
plt.title("Kvadratlar")
plt.show()
 
# 2. Obyektga yo'naltirilgan uslub — ✅ tavsiya etiladi
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3], [1, 4, 9])
ax.set_title("Kvadratlar")
fig.savefig("squares.png", dpi=150)

Har doim ikkinchi uslubni ishlating: qaysi grafikka nima chizilayotgani aniq, bir nechta grafik bilan ishlash oson, funksiyalarga ax uzatish mumkin. Internetdagi misollarning ko'pi plt. uslubida — ularni ax. ga o'girish oson: plt.title → ax.set_title, plt.xlabel → ax.set_xlabel.

2. Asosiy grafik turlari#

fig, ax = plt.subplots()
 
ax.plot(x, y, label="model A", linestyle="--", marker="o")   # chiziq — trend, vaqt
ax.scatter(x, y, s=10, alpha=0.5, c=labels)                  # nuqtalar — ikki o'zgaruvchi munosabati
ax.hist(values, bins=40)                                     # gistogramma — taqsimot
ax.bar(categories, heights)                                  # ustunlar — kategoriyalarni solishtirish
ax.barh(categories, widths)                                  # gorizontal — uzun nomlar uchun
ax.boxplot([group1, group2])                                 # quti — taqsimotlarni solishtirish
ax.imshow(matrix, cmap="viridis")                            # matritsa / rasm
ax.errorbar(x, means, yerr=stds, capsize=3)                  # xato chegaralari bilan
ax.fill_between(x, lower, upper, alpha=0.2)                  # oraliq (ishonch intervali)

Bezash#

ax.set(title="Sarlavha", xlabel="X o'qi", ylabel="Y o'qi")   # bir nechtasini birdan
ax.set_xlim(0, 100); ax.set_ylim(bottom=0)
ax.set_yscale("log")                                         # logarifmik shkala
ax.legend(loc="upper right")                                 # label= berilganlar uchun
ax.grid(alpha=0.3)
ax.axhline(0.9, color="gray", linestyle=":")                 # gorizontal chiziq (maqsad, baseline)
ax.annotate("cho'qqi", xy=(x0, y0), xytext=(x0 + 5, y0 + 1), arrowprops=dict(arrowstyle="->"))

3. Qaysi grafik qachon#

SavolGrafik
Qiymat vaqt bo'yicha qanday o'zgaradi?Chiziq (plot)
Bitta o'zgaruvchi qanday taqsimlangan?Gistogramma (hist), KDE
Guruhlar o'rtasida taqsimot farq qiladimi?Boxplot / violin
Kategoriyalar qanday solishtiriladi?Ustunlar (bar/barh), saralangan
Ikki son o'zgaruvchi bog'liqmi?Nuqtalar (scatter)
Ko'p o'zgaruvchilar korrelyatsiyasi?Heatmap
Model qaysi sinflarni chalkashtiradi?Confusion matrix (heatmap)
Model qanday o'rganyapti?Loss/metrika egri chiziqlari

4. Bir nechta grafik: subplots#

df = pd.read_csv("orders.csv", parse_dates=["date"])
df["revenue"] = df["price"] * df["qty"]
 
fig, axes = plt.subplots(2, 2, figsize=(11, 7.5), layout="constrained")   # axes — (2, 2) NumPy massiv
 
axes[0, 0].hist(df["price"] / 1000, bins=40)
axes[0, 0].set(title="Narx taqsimoti", xlabel="ming so'm", ylabel="buyurtmalar")
 
axes[0, 1].hist(np.log10(df["price"]), bins=40)
axes[0, 1].set(title="Narx (log10 shkalada)", xlabel="log10(narx)")
 
(df.groupby("city")["revenue"].sum() / 1e6).sort_values().plot.barh(ax=axes[1, 0])
axes[1, 0].set(title="Shaharlar bo'yicha tushum", xlabel="mln so'm", ylabel="")
 
monthly = df.set_index("date").resample("ME")["revenue"].sum() / 1e6
axes[1, 1].bar(monthly.index.strftime("%Y-%m"), monthly.values)
axes[1, 1].set(title="Oylik tushum", ylabel="mln so'm")
axes[1, 1].tick_params(axis="x", rotation=45)
 
for ax in axes.flat:
    ax.grid(alpha=0.3)
fig.suptitle("Buyurtmalar: EDA")
fig.savefig("eda.png", dpi=120)

20-bobdagi buyurtmalar datasetining EDA grafiklari: narx gistogrammasi oddiy va log shkalada, shaharlar bo'yicha tushum va oylik tushum

Bu to'rt grafikdan nimalarni o'qish mumkin:

  • Chap yuqori: narx taqsimoti kuchli o'ngga og'gan — ko'p arzon buyurtmalar va kam sonli juda qimmatlari. Shuning uchun o'rtacha > mediana.
  • O'ng yuqori: log shkalada taqsimot "qo'ng'iroq" shakliga keladi — ya'ni narx log-normal taqsimlangan (aslida biz uni shunday yaratganmiz, 20-bob). ML'da bunday xususiyatlarni ko'pincha log bilan o'zgartirish modelga yordam beradi.
  • Chap pastki: Toshkent tushumi boshqa shaharlardan 2.5–3 baravar ko'p.
  • O'ng pastki: oylar bo'yicha keskin trend yo'q; oxirgi oy (sentabr) to'liq bo'lmagani uchun pastroq bo'lishi mumkin — qisman davrlarni grafikda belgilang, aks holda "pasayish" deb noto'g'ri talqin qilinadi.

layout="constrained" — sarlavha va yozuvlar bir-biriga mingashmasligi uchun (eski kodlardagi plt.tight_layout() o'rnida).

5. ML uchun eng muhim grafik: o'qitish egri chiziqlari#

rng = np.random.default_rng(0)
epochs = np.arange(1, 31)
train_loss = 2.0 * np.exp(-epochs / 8) + 0.15 + rng.normal(0, 0.02, 30)
val_loss = 2.0 * np.exp(-epochs / 8) + 0.3 + np.maximum(0, (epochs - 18) * 0.02) + rng.normal(0, 0.03, 30)
 
fig, ax = plt.subplots(figsize=(8, 4.5), layout="constrained")
ax.plot(epochs, train_loss, label="train")
ax.plot(epochs, val_loss, label="validation")
 
best = int(np.argmin(val_loss)) + 1
ax.axvline(best, ls="--", c="gray")
ax.annotate(f"eng yaxshi: {best}-epoch", xy=(best, val_loss.min()),
            xytext=(best + 2, val_loss.min() + 0.4), arrowprops=dict(arrowstyle="->"))
ax.set(xlabel="Epoch", ylabel="Loss", title="O'qitish egri chiziqlari")
ax.legend()
ax.grid(alpha=0.3)
fig.savefig("curves.png", dpi=150)

Train va validation loss egri chiziqlari: train loss pasayishda davom etadi, validation loss 22-epoch atrofida eng past nuqtaga yetib, keyin ko'tariladi

Bu grafik — ML'dagi eng muhim diagnostika:

Ko'rinishTashxisNima qilish kerak
Ikkalasi ham tushyaptiHali o'rganyaptiKo'proq epoch
Train tushadi, validation ko'tariladi (yuqoridagi kabi)OverfittingEarly stopping (eng yaxshi epoch'dagi checkpoint), regulyarizatsiya, ko'proq ma'lumot
Ikkalasi ham baland va tekisUnderfittingKattaroq model, yaxshiroq xususiyatlar, lr'ni tekshiring
Juda shovqinli, sakraydilr juda katta yoki batch kichiklr'ni kamaytiring
nan / yo'qolib qoldiRaqamli beqarorlik (19-bob)lr, normalizatsiya, gradient clipping

6. Pandas'dan to'g'ridan-to'g'ri chizish#

Tezkor tahlil uchun Pandas'ning .plot metodi qulay (ichkarida Matplotlib):

df["price"].plot.hist(bins=40)
df.groupby("category")["revenue"].sum().sort_values().plot.barh()
monthly.plot(marker="o")
df.plot.scatter(x="price", y="rating", alpha=0.3)
 
ax = df.groupby("city")["price"].median().plot.bar(rot=0)   # Axes qaytaradi — bezash mumkin
ax.set_ylabel("mediana narx")

7. Seaborn — statistik grafiklar#

Seaborn Matplotlib ustiga qurilgan va DataFrame bilan "uzun format"da ishlaydi: ustun nomlarini berasiz, u guruhlash va rang berishni o'zi qiladi.

import seaborn as sns
 
sns.set_theme(style="whitegrid")
 
fig, axes = plt.subplots(1, 3, figsize=(15, 4), layout="constrained")
sns.histplot(data=df, x="price", hue="category", log_scale=True, element="step", ax=axes[0])
sns.boxplot(data=df, x="city", y="price", log_scale=True, ax=axes[1])
sns.barplot(data=df, x="category", y="rating", errorbar=("ci", 95), ax=axes[2])   # o'rtacha + 95% interval

Ko'p ishlatiladiganlari:

FunksiyaNima uchun
histplot, kdeplotTaqsimot (guruhlar bo'yicha hue=)
boxplot, violinplotGuruhlar taqsimotini solishtirish
barplotO'rtacha + ishonch intervali
scatterplot, regplotMunosabat, regressiya chizig'i bilan
heatmapMatritsa: korrelyatsiya, confusion matrix
pairplotHamma juft o'zgaruvchilar — kichik datasetni tez ko'rish
relplot, catplotKo'p panelli (faceted) grafiklar

Korrelyatsiya heatmap'i#

num = df[["price", "qty", "rating", "revenue"]]
sns.heatmap(num.corr(), annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1, square=True)

vmin=-1, vmax=1 — rang shkalasi markazlashgan bo'lishi uchun (0 — neytral rang). Aks holda kichik korrelyatsiyalar "kuchli" ko'rinadi.

8. Saqlash va Jupyter#

fig.savefig("plot.png", dpi=150, bbox_inches="tight")   # hisobot uchun PNG
fig.savefig("plot.svg")                                  # vektor — veb va maqolalar uchun
fig.savefig("plot.pdf")                                  # LaTeX maqolalar uchun
plt.close(fig)                                           # siklda ko'p grafik yaratsangiz — xotirani bo'shating

Jupyter'da grafiklar avtomatik ko'rsatiladi. Skriptda (server, CI) ekran yo'q — matplotlib.use("Agg") yoki MPLBACKEND=Agg va faqat savefig. Siklda yuzlab grafik yaratib, plt.close qilmasangiz — xotira to'lib boradi va Matplotlib ogohlantiradi.

9. Yaxshi grafik qoidalari#

  1. Bitta grafik — bitta xabar

    Grafik qaysi savolga javob beradi? Sarlavhani shu javob qiling: "Validation loss 22-epoch'dan keyin o'smoqda" — "Loss grafigi"dan yaxshiroq.
  2. O'qlarni nomlang va birlik yozing

    "Narx" emas — "Narx, ming so'm". "Vaqt" emas — "Kechikish, s".
  3. Ustunli grafiklar noldan boshlansin

    Aks holda kichik farq ulkan ko'rinadi. Chiziqli grafiklarda bu shart emas.
  4. Saralang

    Kategoriyalarni alifbo bo'yicha emas, qiymat bo'yicha saralang — taqqoslash osonlashadi.
  5. Rangni ma'no uchun ishlating

    Bitta narsani ajratib ko'rsatish uchun bitta yorqin rang, qolgani kulrang. Rang ko'rish nuqsoni bo'lganlar uchun qizil–yashil juftini qoching (viridis, cividis palitralari xavfsiz).
  6. Ko'p nuqtada shaffoflik

    Minglab nuqtali scatter'da alpha=0.2, s=5 — aks holda bir rangli dog'.

10. Amaliyot: model natijalari hisoboti#

Eval natijalaridan (20-bob amaliyoti) bitta rasmda hisobot:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
 
def eval_report(evals: pd.DataFrame, path: str) -> None:
    summary = evals.groupby("variant").agg(
        accuracy=("correct", "mean"),
        n=("correct", "size"),
        cost=("cost_usd", "mean"),
        p95=("latency_s", lambda s: s.quantile(0.95)),
    )
    se = np.sqrt(summary["accuracy"] * (1 - summary["accuracy"]) / summary["n"])   # standart xato
 
    fig, axes = plt.subplots(1, 3, figsize=(15, 4.2), layout="constrained")
 
    order = summary["accuracy"].sort_values().index
    axes[0].barh(order, summary.loc[order, "accuracy"], xerr=1.96 * se[order], capsize=4)
    axes[0].set(title="Aniqlik (95% interval)", xlim=(0, 1))
 
    for variant, g in evals.groupby("variant"):
        axes[1].hist(g["latency_s"], bins=30, alpha=0.5, label=variant)
    axes[1].set(title="Kechikish taqsimoti", xlabel="s")
    axes[1].legend()
 
    axes[2].scatter(summary["cost"] * 1000, summary["accuracy"], s=80)
    for name, row in summary.iterrows():
        axes[2].annotate(name, (row["cost"] * 1000, row["accuracy"]), xytext=(5, 5), textcoords="offset points")
    axes[2].set(title="Narx va aniqlik", xlabel="$ / 1000 so'rov", ylabel="aniqlik")
 
    for ax in axes:
        ax.grid(alpha=0.3)
    fig.savefig(path, dpi=150)
    plt.close(fig)

Uchinchi grafik — "narx va aniqlik" — real qarorlar shu yerda qabul qilinadi: eng aniq variant eng qimmat bo'lishi mumkin, va 1% aniqlik uchun 2 baravar ko'p to'lash har doim ham o'rinli emas.

Nima noto'g'ri ketishi mumkin#

XatoOqibatTuzatish
plt. va ax. aralashGrafik noto'g'ri joyga chiziladiFaqat fig, ax = plt.subplots()
Sarlavha/yozuvlar ustma-ustO'qib bo'lmaydilayout="constrained"
Ustunli grafik 0 dan boshlanmaydiFarq bo'rttirib ko'rsatiladiax.set_ylim(bottom=0)
O'qlarda birlik yo'qTalqin qilib bo'lmaydixlabel="Narx, ming so'm"
Og'gan taqsimot oddiy shkaladaHamma narsa bitta ustundalog_scale=True yoki np.log10
Siklda plt.close yo'qXotira to'ladiplt.close(fig)
Serverda grafik ochishga urinishXato yoki osilib qolishmatplotlib.use("Agg"), savefig
Heatmap rangi markazlashmaganKichik korrelyatsiya "kuchli" ko'rinadivmin=-1, vmax=1, cmap="coolwarm"
Qisman davr (oxirgi oy)Soxta "pasayish"Belgilang yoki chiqarib tashlang
Amaliy topshiriq

1. EDA paneli

orders.csv uchun 2×3 paneldan iborat EDA rasmini yarating: kategoriyalar bo'yicha narx boxplot'i (log shkala), reyting taqsimoti, hafta kunlari bo'yicha buyurtmalar soni, shahar × kategoriya tushum heatmap'i, qty va price scatter'i, oylik buyurtmalar soni. Har bir grafik sarlavhasi — xulosa bo'lsin.

Maslahatni ko'rsatish

fig, axes = plt.subplots(2, 3); sns.histplot(..., ax=axes[0, 0]); har grafik uchun sarlavhani xulosa qilib yozing.

Amaliy topshiriq

2. Overfitting'ni ko'rsatish

y = sin(x) + shovqin ma'lumotiga 1 dan 15 gacha darajali polinomlarni moslang (np.polyfit). Chap panelda — ma'lumot va 1, 4, 15-darajali egri chiziqlar; o'ng panelda — daraja bo'yicha train va test xatoligi. Grafikdan optimal darajani aniqlang.

Maslahatni ko'rsatish

np.polyfit(x, y, deg) va np.polyval; train va test MSE'ni darajalar bo'yicha hisoblab, ikki chiziq chizing.

Amaliy topshiriq

3. Funksiya sifatida grafik

plot_curves(history, ax=None) funksiyasini yozing: {"train_loss": [...], "val_loss": [...], "val_acc": [...]} lug'atini qabul qilib, loss'larni chap o'qda, accuracy'ni o'ng o'qda (ax.twinx()) chizsin va eng yaxshi epoch'ni belgilasin. ax berilsa — unga chizsin (subplots ichida ishlatish uchun).

Maslahatni ko'rsatish

def plot_curves(history: dict[str, list[float]], ax=None) -> plt.Axes: if ax is None: _, ax = plt.subplots(); ... return ax.

Amaliy topshiriq

4. Embedding'larni 2D'da ko'rish

19-bobdagi kabi tasodifiy embedding'lar o'rniga 3 ta "klaster" yarating (har biri o'z markazi atrofida normal taqsimot, 50 o'lchamli). PCA bilan 2 o'lchamga tushiring (np.linalg.svd yoki 22-bobdagi sklearn.decomposition.PCA) va klasterlar rangi bilan scatter chizing.

Yodda saqlang
  • 01Figure — varaq, Axes — grafik maydoni; har doim fig, ax = plt.subplots() uslubi.
  • 02Grafik turi savolga qarab: vaqt — chiziq, taqsimot — gistogramma/boxplot, solishtirish — saralangan ustunlar, munosabat — scatter.
  • 03subplots + layout='constrained' — bir nechta grafik tartibli.
  • 04O'qitish egri chiziqlari — overfitting/underfitting diagnostikasi.
  • 05Pandas .plot — tezkor ko'rish; Seaborn — DataFrame bilan statistik grafiklar va heatmap.
  • 06Og'gan taqsimotlarga log shkala; ustunlar noldan; o'qlarda birliklar; sarlavha — xulosa.
  • 07Serverda Agg backend va savefig; siklda plt.close.

Mustahkamlash

Test va amaliy masalalar

Avval testni ishlang — har javobdan keyin izoh chiqadi. Keyin masalalarni shu yerning o'zida yechib, brauzerdagi haqiqiy Python bilan avtomatik tekshiring. Natijalaringiz kurs progressi sahifasida jamlanadi.

Test: topshirilmaganMasalalar: 0/3

Bilimni tekshirish

Bob bo'yicha test

12 ta savol · har javobdan keyin to'g'ri yoki xatoligi va izoh ko'rsatiladi · oxirida natija foizda.

Amaliy masalalar

Kodni yozing va «Tekshirish»ni bosing (yoki Ctrl/⌘ + Enter). Kodingiz shu brauzerda saqlanib turadi.

01O'qitish egri chiziqlari

plot_curves(history) — {"train_loss": [...], "val_loss": [...]} lug'atidan grafik chizib (fig, ax) qaytarsin: ikki chiziq (label lari "train" va "validation"), x o'qi — epoch (1 dan), xlabel="Epoch", ylabel="Loss", legenda, va eng kichik validation loss epoch'ida vertikal chiziq (ax.axvline). Fayl boshida matplotlib.use("Agg").

02Saralangan gorizontal ustunlar

plot_revenue(totals) — {"Toshkent": 278, "Buxoro": 87, ...} lug'atidan ax.barh bilan grafik qursin: ustunlar qiymat bo'yicha o'sish tartibida (eng kattasi tepada ko'rinadi), sarlavha "Shaharlar bo'yicha tushum". (fig, ax) qaytarsin.

03Subplots paneli

panel(data) — data lug'atidagi har kalit uchun alohida gistogramma (bitta qatorda 1 × n subplots, figsize=(4*n, 3)), har Axes sarlavhasi — kalit nomi. fig qaytarsin.