Asosiy qismga o'tish

Asosiy grafiklar: savol grafikni tanlaydi

18-bob 6 kod bloki 1394 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

Sahna: "qaysi grafikni chizay?"

Bu savol noto'g'ri qo'yilgan. To'g'ri savol — "nimani bilmoqchiman?". Vaqt bo'yicha o'zgarishmi, solishtirishmi, taqsimotmi, aloqami — har biriga o'z grafigi bor. Noto'g'ri tanlangan grafik ma'lumot ko'rsatmaydi, yashiradi.

Savol grafikni tanlaydi: line, bar, hist, scatter, boxplot, heatmap

Savol grafikni tanlaydi: line, bar, hist, scatter, boxplot, heatmap

Bu bobda beshta asosiy grafikni do'kon va avtomobil ma'lumotidagi real savollar bilan chizamiz.

python17 qator
import numpy as np
import pandas as pd

savdo = pd.read_csv(DATA / "dokon_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y")
savdo["tushum"] = savdo["miqdor"] * savdo["narx"]


def narxni_son(ustun):
    matn = ustun.str.lower().str.replace("so'm", "").str.replace(" ", "")
    son = pd.to_numeric(matn.str.replace("mln", ""))
    return son.where(~matn.str.endswith("mln"), son * 1_000_000)


avto = (pd.read_csv(DATA / "avto_savdo.csv").drop_duplicates()
        .assign(model=lambda d: d["model"].str.strip().str.title(), narx=lambda d: narxni_son(d["narx"]) / 1e6,
                yoshi=lambda d: 2025 - d["yil"]))
print(savdo.shape, avto.shape)
Chiqish
(11352, 9) (600, 10)

Avtomobil jadvali — 12–13-boblardagi tozalashning qisqa varianti (takrorlar, model nomi, narx).

line — vaqt bo'yicha o'zgarish

Savol: haftalik tushum yil davomida qanday o'zgardi?

python5 qator
haftalik = savdo.set_index("sana")["tushum"].resample("W").sum() / 1e6
fig, ax = plt.subplots(figsize=(10, 3.2))
ax.plot(haftalik.index, haftalik.values, color="#1a73e8", linewidth=1.8)
ax.set(title="Haftalik tushum", ylabel="mln so'm")
plt.show()

Chiziq qo'shni nuqtalarni bog'laydi — shuning uchun x o'qi tartibli bo'lishi kerak (vaqt, yosh, harorat). Kategoriyalar (filiallar, modellar) orasini chiziq bilan bog'lash — xato: "Chilonzor va Sergeli orasida" degan joy yo'q.

bar — kategoriyalarni solishtirish

Savol: qaysi to'lov turi ko'proq pul keltiradi?

python6 qator
tolov = savdo.groupby("tolov")["tushum"].sum().sort_values() / 1e6
fig, ax = plt.subplots(figsize=(7, 2.8))
ustunlar = ax.barh(tolov.index, tolov.values, color="#b06000")
ax.bar_label(ustunlar, fmt="%.0f", padding=3)
ax.set(title="To'lov turi bo'yicha tushum, mln so'm", xlim=(0, tolov.max() * 1.15))
plt.show()

Uchta qaror:

  • barh (gorizontal) — nomlar uzun bo'lsa yoki ko'p bo'lsa, ular o'qilishi oson.
  • Saralash (sort_values) — ko'z eng kattasini darhol topadi. Saralanmagan bar — alifbo tartibidagi tasodif.
  • bar_label — har ustunga uning qiymatini yozadi: o'quvchi o'qdan qiymat taxmin qilib o'tirmaydi.

Bar grafikda o'q noldan boshlanishi shart — 21-bobda nega ekanini ko'ramiz.

hist — bitta sonning taqsimoti

Savol: cheklar qanday summada bo'ladi?

python8 qator
chek = savdo.groupby("chek_id")["tushum"].sum() / 1000
fig, axs = plt.subplots(1, 3, figsize=(12, 3))
for ax, bins in zip(axs, [5, 30, 300]):
    ax.hist(chek, bins=bins, color="#137333")
    ax.set_title(f"bins={bins}")
    ax.set_xlabel("chek, ming so'm")
plt.show()
print(f"cheklar: {len(chek)}, median {chek.median():.0f} ming, eng katta {chek.max():.0f} ming")
Chiqish
cheklar: 5687, median 80 ming, eng katta 424 ming

Histogramma sonlarni oraliqlarga (bin) bo'lib, har oraliqda nechta borligini sanaydi. Bin soni hikoyani o'zgartiradi:

  • bins=5 — juda qo'pol: shakl yo'qoladi, faqat "ko'pchilik kichik" ko'rinadi.
  • bins=30 — shakl ko'rinadi: ko'p cheklar kichik, o'ngga uzun "dum" (qimmat cheklar kam).
  • bins=300 — har oraliqda bir necha chek: tasodifiy "taroq", shakl shovqinga ko'milgan.

Qoida: bitta bin soniga ishonmang — ikki-uchtasida chizib, hammasida saqlanadigan shaklni qabul qiling.

scatter — ikki son orasidagi aloqa

Savol: mashina eskirgan sari narxi qanday tushadi?

python10 qator
fig, ax = plt.subplots(figsize=(8, 3.8))
for model, rang in [("Spark", "#1a73e8"), ("Cobalt", "#137333"), ("Captiva", "#c5221f")]:
    qism = avto[avto["model"] == model]
    ax.scatter(qism["yoshi"], qism["narx"], s=22, alpha=0.6, color=rang, label=model)
ax.set(title="Yosh va narx", xlabel="yoshi, yil", ylabel="narx, mln so'm")
ax.legend()
plt.show()
for model in ["Spark", "Cobalt", "Captiva"]:
    q = avto[avto["model"] == model]
    print(f"{model:<8} korrelyatsiya (yosh, narx): {q['yoshi'].corr(q['narx']):.2f}")
Chiqish
Spark    korrelyatsiya (yosh, narx): -0.97
Cobalt   korrelyatsiya (yosh, narx): -0.97
Captiva  korrelyatsiya (yosh, narx): -0.97

Har nuqta — bitta mashina. Uch model ham bir xil naqshni ko'rsatadi: yosh oshgan sari narx tushadi, va korrelyatsiya buni son bilan tasdiqlaydi (−1 ga yaqin — kuchli teskari aloqa). Lekin qiyalik har xil: Captiva qimmatroq boshlanadi va har yili ko'proq so'm yo'qotadi.

alpha=0.6 — nuqtalar yarim shaffof: ustma-ust tushganda zich joy to'qroq ko'rinadi. Yuzlab nuqtali scatter da shaffoflik — majburiy.

boxplot — guruhlar taqsimotini solishtirish

Savol: to'lov turlarida chek summasi farq qiladimi?

python7 qator
cheklar = savdo.groupby(["chek_id", "tolov"], as_index=False)["tushum"].sum()
tartib = ["naqd", "karta", "Click", "Payme"]
fig, ax = plt.subplots(figsize=(8, 3.4))
ax.boxplot([cheklar.loc[cheklar["tolov"] == t, "tushum"] / 1000 for t in tartib], labels=tartib)
ax.set(title="To'lov turi bo'yicha chek summasi", ylabel="ming so'm")
plt.show()
cheklar.groupby("tolov")["tushum"].median().div(1000).round(1)
tolovtushum
Click78
Payme76
karta82
naqd79

Boxplot taqsimotni beshta son bilan chizadi: quti — o'rtadagi yarmi (25%–75%), ichidagi chiziq — median, "mo'ylovlar" — odatiy oraliq, nuqtalar — chetki qiymatlar. To'rt quti deyarli bir xil: to'lov turi chek summasiga ta'sir qilmaydi. Bar grafik (yuqorida) esa to'lov turlari orasida katta farq ko'rsatgan edi. Ikkalasi ham to'g'ri: farq cheklar sonida, chek hajmida emas. Bitta grafik bitta savolga javob beradi.

Qisqa tanlov jadvali

Savol Grafik Matplotlib
vaqt bo'yicha qanday o'zgardi? line ax.plot
qaysi kategoriya katta? bar / barh ax.bar, ax.barh
bitta son qanday taqsimlangan? histogram ax.hist
ikki son bog'liqmi? scatter ax.scatter
guruhlar taqsimoti farq qiladimi? boxplot ax.boxplot
ikki kategoriya bo'yicha son? heatmap ax.imshow

Pie (doira) grafik jadvalda yo'q: odam ko'zi burchaklarni ustunlar uzunligidan ancha yomon solishtiradi. 4–5 dan ortiq bo'lak bo'lsa, doira deyarli o'qilmaydi. Ulush kerak bo'lsa — saralangan barh.

Xulosa

  • Grafikni savol tanlaydi: vaqt — line, solishtirish — bar, taqsimot — hist, aloqa — scatter, guruhlar taqsimoti — boxplot.
  • Line — faqat tartibli x uchun; bar — saralangan, noldan, bar_label bilan.
  • Histogrammani bir nechta bin soni bilan tekshiring.
  • Ko'p nuqtali scatter — alpha bilan.
  • Bir grafik — bir savol: bar va boxplot bir ma'lumotdan har xil narsa aytishi mumkin.

Mashqlar

  1. Har kategoriya bo'yicha sotilgan dona sonini saralangan barh bilan chizing (mahsulotlar.csv bilan merge kerak, 15-bob).
  2. Avtomobil narxlari histogrammasini 10, 40 va 150 bin bilan chizing. Qaysi shakl barqaror?
  3. Probeg va narx orasidagi scatter ni chizing. Korrelyatsiya yoshdagi bilan solishtirganda qanday?

Javoblar

  1. savdo.merge(katalog, on="mahsulot_id").groupby("kategoriya")["miqdor"].sum().sort_values().plot(kind="barh").
  2. Har uchtasida o'ngga cho'zilgan shakl: arzon mashinalar ko'p, qimmatlari kam.
  3. Probeg yoshga bog'liq, shuning uchun u ham narx bilan teskari bog'langan.

Bu bobni bepul o'qidingiz.

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

Telegramda yozish Narxlar