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 seabornimport matplotlib.pyplot as plt
import numpy as np
import pandas as pdMatplotlib'da birinchi grafiklar: chiziqlar, sarlavhalar, legenda va uslublar.
1. Matplotlib'ning ikki qatlami: Figure va Axes#
Matplotlib'da ikkita asosiy obyekt bor va ularni farqlash — hamma chalkashliklarning yechimi:
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#
| Savol | Grafik |
|---|---|
| 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)
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
logbilan 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)
Bu grafik — ML'dagi eng muhim diagnostika:
| Ko'rinish | Tashxis | Nima qilish kerak |
|---|---|---|
| Ikkalasi ham tushyapti | Hali o'rganyapti | Ko'proq epoch |
| Train tushadi, validation ko'tariladi (yuqoridagi kabi) | Overfitting | Early stopping (eng yaxshi epoch'dagi checkpoint), regulyarizatsiya, ko'proq ma'lumot |
| Ikkalasi ham baland va tekis | Underfitting | Kattaroq model, yaxshiroq xususiyatlar, lr'ni tekshiring |
| Juda shovqinli, sakraydi | lr juda katta yoki batch kichik | lr'ni kamaytiring |
nan / yo'qolib qoldi | Raqamli 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% intervalKo'p ishlatiladiganlari:
| Funksiya | Nima uchun |
|---|---|
histplot, kdeplot | Taqsimot (guruhlar bo'yicha hue=) |
boxplot, violinplot | Guruhlar taqsimotini solishtirish |
barplot | O'rtacha + ishonch intervali |
scatterplot, regplot | Munosabat, regressiya chizig'i bilan |
heatmap | Matritsa: korrelyatsiya, confusion matrix |
pairplot | Hamma juft o'zgaruvchilar — kichik datasetni tez ko'rish |
relplot, catplot | Ko'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'shatingJupyter'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#
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.O'qlarni nomlang va birlik yozing
"Narx" emas — "Narx, ming so'm". "Vaqt" emas — "Kechikish, s".Ustunli grafiklar noldan boshlansin
Aks holda kichik farq ulkan ko'rinadi. Chiziqli grafiklarda bu shart emas.Saralang
Kategoriyalarni alifbo bo'yicha emas, qiymat bo'yicha saralang — taqqoslash osonlashadi.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,cividispalitralari xavfsiz).Ko'p nuqtada shaffoflik
Minglab nuqtali scatter'daalpha=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#
| Xato | Oqibat | Tuzatish |
|---|---|---|
plt. va ax. aralash | Grafik noto'g'ri joyga chiziladi | Faqat fig, ax = plt.subplots() |
| Sarlavha/yozuvlar ustma-ust | O'qib bo'lmaydi | layout="constrained" |
| Ustunli grafik 0 dan boshlanmaydi | Farq bo'rttirib ko'rsatiladi | ax.set_ylim(bottom=0) |
| O'qlarda birlik yo'q | Talqin qilib bo'lmaydi | xlabel="Narx, ming so'm" |
| Og'gan taqsimot oddiy shkalada | Hamma narsa bitta ustunda | log_scale=True yoki np.log10 |
Siklda plt.close yo'q | Xotira to'ladi | plt.close(fig) |
| Serverda grafik ochishga urinish | Xato yoki osilib qolish | matplotlib.use("Agg"), savefig |
| Heatmap rangi markazlashmagan | Kichik korrelyatsiya "kuchli" ko'rinadi | vmin=-1, vmax=1, cmap="coolwarm" |
| Qisman davr (oxirgi oy) | Soxta "pasayish" | Belgilang yoki chiqarib tashlang |
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.
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.
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.
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.
- 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.
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.