Ma'lumotni tasvirlash: info, describe, value_counts
Sahna: yangi fayl bilan birinchi besh daqiqa
Fayl keldi. Tahlil, model, hisobot — keyin. Avval so'roq: nechta qator? Qaysi ustunlar bo'sh? Sonlar qaysi oraliqda? Matnli ustunlarda nechta xil qiymat? Bu bob — shu so'roqning standart tartibi. Har bir tajribali tahlilchi yangi faylni aynan shunday ochadi.
import pandas as pd avto = pd.read_csv(DATA / "avto_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y")
info: umumiy ko'rinish
avto.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 612 entries, 0 to 611 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 elon_id 612 non-null int64 1 sana 612 non-null datetime64[ns] 2 model 612 non-null object 3 rang 612 non-null object 4 yil 612 non-null int64 5 probeg_km 575 non-null object 6 uzatma 612 non-null object 7 viloyat 612 non-null object 8 narx 612 non-null object dtypes: datetime64[ns](1), int64(2), object(6) memory usage: 43.2+ KB
info bitta jadvalda to'rt narsani aytadi: qatorlar soni (RangeIndex), har ustunning bo'sh bo'lmagan qiymatlar soni (Non-Null Count), turi va xotira. Qatorlar 612, probeg_km da esa kamroq — demak u yerda bo'sh kataklar bor.
describe: sonlar haqida qisqa hisobot
avto.describe()
| elon_id | sana | yil | |
|---|---|---|---|
| count | 612 | 612 | 612 |
| mean | 1302.016 | 2025-06-01 07:12:56.470588160 | 2018.016 |
| min | 1001 | 2025-01-01 00:00:00 | 2012 |
| 25% | 1150.75 | 2025-03-22 18:00:00 | 2015 |
| 50% | 1302.5 | 2025-06-01 00:00:00 | 2018 |
| 75% | 1453.25 | 2025-08-18 00:00:00 | 2021 |
| max | 1600 | 2025-10-27 00:00:00 | 2024 |
| std | 173.936 | NaN | 3.611 |
Son ustunlar uchun: soni (count), o'rtacha, std, eng kichik, chorak chegaralari (25%, 50% — median, 75%) va eng katta. 5-bobdagi hamma aggregatsiya — bitta buyruqda.
E'tibor bering: jadvalda faqat elon_id, sana va yil bor. narx va probeg_km — yo'q, chunki ular hali matn (9-bob). Tahlilning eng muhim ustuni — narx — tasvirlashga ham kirmadi. Bu — "tozalash kerak" degan birinchi signal.
elon_id ning o'rtachasi — ma'nosiz son: u identifikator, miqdor emas. describe buni bilmaydi; o'qiyotganda siz bilishingiz kerak.
Matnli ustunlar uchun alohida:
avto.describe(include="object")
| model | rang | probeg_km | uzatma | viloyat | narx | |
|---|---|---|---|---|---|---|
| count | 612 | 612 | 575 | 612 | 612 | 612 |
| unique | 45 | 5 | 561 | 2 | 7 | 436 |
| top | Onix | Oq | 100185 | Avtomat | Samarqand | 39 500 000 so'm |
| freq | 41 | 141 | 2 | 326 | 107 | 6 |
unique — nechta xil qiymat, top — eng ko'p uchragani, freq — necha marta. model ustunida 45 xil qiymat — lekin do'konda 9 ta model bor-ku? Yana bir signal.
value_counts: har qiymat necha marta
cobaltlar = avto["model"].str.strip().str.lower() == "cobalt" avto.loc[cobaltlar, "model"].value_counts()
| model | count |
|---|---|
| Cobalt | 26 |
| COBALT | 12 |
| Cobalt | 12 |
| cobalt | 12 |
| Cobalt | 10 |
Bitta model — besh xil yozilish: oddiy, katta harf, kichik harf, oldida yoki oxirida bo'shliq bilan. pandas uchun ular har xil qiymatlar. Odam uchun bir xil. 12-bobda .str.strip().str.title() bilan birlashtiramiz.
Foizda ko'rish uchun — normalize=True:
(avto["uzatma"].value_counts(normalize=True) * 100).round(1)
| uzatma | proportion |
|---|---|
| Avtomat | 53.3 |
| Mexanika | 46.7 |
Bo'sh kataklar xaritasi
boshlar = avto.isna().sum() print(boshlar[boshlar > 0]) print(f"jami {avto.isna().sum().sum()} bo'sh katak, {avto.isna().any(axis=1).sum()} qatorda")
probeg_km 37 dtype: int64 jami 37 bo'sh katak, 37 qatorda
isna() — har katak uchun True/False (3-bobdagi mask). .sum() — har ustun bo'yicha nechta True: 5-bobdagi aggregatsiya, axis=0. .any(axis=1) — kamida bitta bo'sh katagi bor qatorlar.
Ko'z bilan ko'rish uchun — mask ning o'zini rasm qilamiz:
fig, ax = plt.subplots(figsize=(8, 3.6)) ax.imshow(avto.isna().to_numpy().T, aspect="auto", cmap="Greys", interpolation="nearest") ax.set_yticks(range(avto.shape[1]), avto.columns) ax.set_xlabel("qator raqami") ax.set_title("Qora chiziq — bo'sh katak") plt.show()

Bo'sh kataklar faqat probeg_km da va fayl bo'ylab tarqalgan — bir joyga to'planmagan. Bu muhim: agar ular faqat oxirgi oylarda bo'lganida, sabab boshqa (masalan, sayt formasi o'zgargan) bo'lardi va to'ldirish usuli ham boshqa bo'lardi.
Takrorlar
print("to'liq takror qatorlar:", avto.duplicated().sum()) print("takror elon_id:", avto["elon_id"].duplicated().sum()) avto[avto.duplicated(keep=False)].sort_values("elon_id").head(4)
to'liq takror qatorlar: 12 takror elon_id: 12
| elon_id | sana | model | rang | yil | probeg_km | uzatma | viloyat | narx | |
|---|---|---|---|---|---|---|---|---|---|
| 77 | 1077 | 2025-01-21 00:00:00 | Gentra | Qizil | 2013 | 209730 | Avtomat | Qashqadaryo | 47 500 000 so'm |
| 208 | 1077 | 2025-01-21 00:00:00 | Gentra | Qizil | 2013 | 209730 | Avtomat | Qashqadaryo | 47 500 000 so'm |
| 80 | 1080 | 2025-09-08 00:00:00 | COBALT | Kumush | 2017 | 153 451 | Mexanika | Buxoro | 74 000 000 so'm |
| 497 | 1080 | 2025-09-08 00:00:00 | COBALT | Kumush | 2017 | 153 451 | Mexanika | Buxoro | 74 000 000 so'm |
duplicated() — butunlay bir xil qatorni topadi (birinchisini asl deb, keyingilarini belgilaydi). keep=False — hamma nusxani ko'rsatadi, shunda juftlarni yonma-yon ko'rasiz. 12 ta e'lon ikki marta yozilgan: hisob-kitobda ular ikki marta sanaladi.
Taqsimotni ko'rish
Raqamlar jadvali — yaxshi, rasm — tezroq:
fig, (chap, ong) = plt.subplots(1, 2, figsize=(10, 3.2)) avto["yil"].plot(kind="hist", bins=13, ax=chap, color="#1a73e8", title="Ishlab chiqarilgan yil") avto["sana"].dt.month.value_counts().sort_index().plot(kind="bar", ax=ong, color="#b06000", title="E'lon berilgan oy", rot=0) plt.show()

.dt.month — sana ustunidan oy raqami (16-bobda batafsil). Yillar 2012–2024 oralig'ida tekis taqsimlangan, e'lonlar esa yanvar–oktyabr bo'ylab.
So'roq tartibi: nazorat ro'yxati
Har yangi faylda:
| Qadam | Buyruq | Nimani qidiramiz |
|---|---|---|
| 1 | shape, head() |
to'g'ri o'qildimi |
| 2 | dtypes / info() |
son ustun matn bo'lib qolmadimi |
| 3 | isna().sum() |
bo'sh kataklar qayerda, nechta |
| 4 | duplicated().sum() |
takror qatorlar |
| 5 | describe() |
sonlar oralig'i, g'alati qiymatlar |
| 6 | value_counts() |
matnli ustunda yozilish xilma-xilligi |
Bu faylda oltita qadam to'rtta muammo topdi: matn bo'lib qolgan narx va probeg, bo'sh probeglar, 12 ta takror e'lon, model nomlarining 45 xil yozilishi. Keyingi bobda (11) kerakli qismni tanlashni o'rganamiz, 12-bobda esa shu to'rttasini tuzatamiz.
Xulosa
info()— qatorlar, bo'sh bo'lmaganlar soni, turlar, xotira.describe()— son ustunlar xulosasi;include="object"— matnlar uchun.value_counts()(normalize=True— foiz) — har qiymat necha marta; yozilish xilma-xilligini fosh qiladi.isna().sum(),duplicated().sum()— bo'sh va takror.- So'roq tartibi: shape → dtypes → isna → duplicated → describe → value_counts.
Mashqlar
dokon_savdo.csvni oltita qadam bilan so'roq qiling. Qanday muammo topdingiz?avtoda qaysi rang eng ko'p? Foizda qancha?avto["viloyat"].nunique()valen(avto["viloyat"].unique())— teng chiqadimi? Qachon farq qiladi?
Javoblar
- Bo'sh katak va takror qator yo'q;
sanamatn (o'qishdadate_formatkerak);filial_idda 5 ta filial bor —filiallar.csvbilan solishtirsangiz, 5-filial ro'yxatda yo'q (15-bobda topamiz). avto["rang"].value_counts(normalize=True)— birinchi qator.- Bu ustunda teng; ustunda
NaNbo'lsa,uniqueuni ham sanaydi,nunique— yo'q.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.