Гузариш ба мундариҷа
Мавзӯи 1 аз 4

Категорияҳо: шумора ва қиматҳои миёна

Чаро графикҳои категорияҳо лозиманд

Кадом вариантро бештар интихоб карданд? Натиҷаи дастаҳо чӣ фарқ дорад? Ҷадвал мушоҳидаҳои алоҳидаро нигоҳ медорад, вале барои ҷавоб онҳоро ба гурӯҳҳо ҷудо кардан лозим аст. Категория номи чунин гурӯҳ аст: навъи ҳайвони хонагӣ, даста ё рӯзи ҳафта. Диаграммаи сутунӣ муқоисаи гурӯҳҳоро осон мекунад.

seaborn бар пояи matplotlib кор мекунад: ҷадвали pandas-ро гирифта, нишондиҳандаҳои омориро ҳисоб мекунад ва натиҷаро дар соҳаи Axes мекашад. Барои шуморидани мушоҳидаҳо countplot ва барои нишондиҳандаи ҷамъбастии ададӣ barplot лозим аст. Интихоби функсия ба савол вобаста аст.

1. Ҷадвал ва шумораи мушоҳидаҳо

Дар ҷадвали «дароз» ҳар сатр як мушоҳида ва ҳар сутун як аломатро тавсиф мекунад. data=pets ҷадвалро медиҳад, x="pet" номи сутуни онро муайян мекунад. Сатрҳои cat, dog ва fish дар ин ҷо нишонаҳои категорияҳо мебошанд.

countplot сатрҳои ҳар категорияро мешуморад. Он қиматҳои ададиро ҷамъ намекунад. Мисолҳои зеринро пайдарпай дар як ҷаласаи Python иҷро кунед. Ҳар plt.subplots() расми алоҳида ва соҳаи онро месозад.

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

pets = pd.DataFrame({"pet": ["cat", "dog", "cat", "fish", "dog", "cat"]})
fig, ax = plt.subplots()
sns.countplot(data=pets, x="pet", ax=ax)
print([t.get_text() for t in ax.get_xticklabels()])
print([int(p.get_height()) for p in ax.patches])

Барориш:

['cat', 'dog', 'fish']
[3, 2, 1]

Аввал навиштаҳо аз чап ба рост ва баъд баландии сутунҳо чоп шудаанд. ax.patches росткунҷаҳои кашидашударо нигоҳ медорад; get_height() баландии онҳоро медиҳад. Ҳамин тавр графикро бе кушодани равзана ҳам санҷидан мумкин аст. Барои дидани расм дар скрипти одӣ баъд аз сохтани он plt.show()-ро даъват кунед.

Дар ин ҷо категорияҳои сатрӣ бо тартиби аввалин пайдоиш меоянд. Категорияҳои ададӣ ва категорияҳои тартибдори pandas метавонанд тартиби дигар дошта бошанд; агар тартиб муҳим бошад, онро ошкоро муайян кунед.

2. Қимати миёна ва фосилаҳои номуайянӣ

Акнун ҳар мушоҳида адади points дорад. Қимати миёна ҷамъи қиматҳо тақсим бар шумораи онҳост. barplot онро ба таври пешфарз барои ҳар категория алоҳида ҳисоб мекунад. Барои дастаи red натиҷа (6 + 14) / 2 = 10 ва барои blue — 12 аст.

scores = pd.DataFrame({"team": ["red", "blue", "red", "blue"],
                       "points": [6, 10, 14, 14]})
fig, ax = plt.subplots()
sns.barplot(data=scores, x="team", y="points", errorbar=None, ax=ax)
print([p.get_height() for p in ax.patches])
print(len(ax.lines))

Барориш:

[10.0, 12.0]
0

errorbar=None фосилаҳои номуайяниро хомӯш мекунад. Аз ин рӯ ax.lines холӣ аст ва сифр чоп мешавад. Бе ин параметр seaborn одатан фосилаи эътимоди 95%-и қимати миёнаро нишон медиҳад: барои арзёбӣ такроран интихобкунии бо баргардониданро истифода мебарад.

Фосила номуайянии арзёбиро тавсиф мекунад, на қиматҳои хурдтарин ва калонтарини мушоҳидаҳоро. Паҳнои он ҳам ба парокандагӣ ва ҳам ба шумораи додаҳо вобаста аст: гурӯҳи хурд ҳатман фосилаи васеътар надорад. Барои такроршавии ҳисобҳои фосила seed-ро муайян кардан мумкин аст.

3. Нишондиҳандаи дигар: estimator

Агрегатсия чанд адади гурӯҳро ба як адад табдил медиҳад. Параметри estimator қоидаро интихоб мекунад: "mean" — қимати миёна, "sum" — ҷамъ, "median" — медиана, "max" — қимати калонтарин. Медиана миёнаҷойи қиматҳои мураттабшуда аст; ҳангоми шумораи ҷуфт миёнаи ду қимати марказиро мегиранд.

fig, ax = plt.subplots()
sns.barplot(data=scores, x="team", y="points",
            estimator="max", errorbar=None, ax=ax)
print([p.get_height() for p in ax.patches])

Барориш:

[14.0, 14.0]

Ҳар ду даста ба 14 расидаанд, гарчанде миёнаҳои онҳо фарқ доштанд. Додаҳои якхела вобаста ба нишондиҳанда диаграммаҳои гуногун медиҳанд. Пеш аз сохтани график муайян кунед, ки баландии сутун чӣ маъно дорад.

4. Тартиби ошкори категорияҳо

Параметри order пайдарпайии нишонаҳоро муайян мекунад. Он ҷойи сутунҳоро тағйир медиҳад, на қиматҳои дохили гурӯҳҳоро. Категорияҳоро аз рӯи маъно, алифбо ё нишондиҳандаи пешакӣ ҳисобшуда ҷойгир кардан мумкин аст.

fig, ax = plt.subplots()
sns.countplot(data=pets, x="pet", order=["fish", "cat", "dog"], ax=ax)
print([t.get_text() for t in ax.get_xticklabels()])
print([int(p.get_height()) for p in ax.patches])

Барориш:

['fish', 'cat', 'dog']
[1, 3, 2]

Аввал моҳӣ бо як мушоҳида, баъд гурбаҳо ва сагҳо нишон дода шудаанд. value_counts() барои гирифтани басомадҳо ва unique() барои номҳои мавҷуда кумак мекунад. Ҳангоми баробарии басомадҳо қоидаи иловагии мураттабсозиро алоҳида интихоб кунед.

5. Диаграммаи уфуқӣ ва навиштаҳо

Номҳои дарозро дар меҳвари амудӣ хондан осонтар аст. Барои сутунҳои уфуқӣ категорияро ба y ва ададро ба x диҳед. Он гоҳ паҳнои росткунҷаҳоро муқоиса мекунанд, на баландии онҳоро. Дар мисоли зерин интихоби меҳварҳо, тартиби ошкор ва ороиш якҷоя шудаанд.

fig, ax = plt.subplots()
sns.barplot(data=scores, y="team", x="points",
            order=["blue", "red"], errorbar=None, ax=ax)
ax.set_xlabel("points")
print([t.get_text() for t in ax.get_yticklabels()])
print([p.get_width() for p in ax.patches])
print(ax.get_xlabel())

Барориш:

['blue', 'red']
[12.0, 10.0]
points

Функсияҳои ин дарс Axes-ро бармегардонанд. Пас ax.set_title(...), ax.set_xlabel(...) ва ax.set_ylabel(...) мисли matplotlib кор мекунанд. color="tab:orange" як ранг ва sns.set_theme() услуби умумиро муайян мекунад. Барои ранги гурӯҳҳо hue ва palette-ро истифода баред; дар seaborn 0.13 истифодаи palette бе hue усули кӯҳнашаванда аст.

Дар дохил чӣ рӯй медиҳад

seaborn сутунҳои додашударо мехонад, категорияҳоро меёбад ва ба онҳо мавқеи меҳварро мувофиқ мекунад. Сипас countplot мушоҳидаҳоро мешуморад, barplot бошад estimator-ро ба ҳар гурӯҳ татбиқ карда, ҳангоми зарурат фосиларо арзёбӣ мекунад. Баъд matplotlib росткунҷаҳо, хатҳо ва навиштаҳоро месозад.

Ин ба ҷудо кардани пурсишномаҳо ба қуттиҳо монанд аст: аввал барои ҳар пурсишнома қуттӣ интихоб мекунанд, баъд пурсишномаҳоро мешуморанд ё аз ададҳояшон нишондиҳанда ҳисоб мекунанд. Тағйири order қуттиҳоро ҷойиваз мекунад, вале мундариҷаро аз нав ҳисоб намекунад. Сохтани график DataFrame-и аслиро тағйир намедиҳад.

Хатоҳои маъмул ва ислоҳи онҳо

1. Номи сутун бо ҷадвал мувофиқ нест

Даъвати нодуруст:

sns.countplot(data=pets, x="missing")

Барориш:

ValueError: Could not interpret value `missing` for `x`. An entry with this name does not appear in `data`.

Дар pets сутуни missing нест. Ислоҳ: pets.columns-ро санҷед ва x="pet"-ро истифода баред. Ном ҳамчун сатр дода мешавад ва бояд бо сарлавҳа, аз ҷумла бо ҳарфҳои хурду калон, мувофиқ бошад.

2. Қимати миёнаро ҷамъ мешуморанд

Агар ҷамъ лозим бошад, интихоби зерини нишондиҳанда нодуруст аст:

fig, ax = plt.subplots()
sns.barplot(data=scores, x="team", y="points", errorbar=None, ax=ax)
print([p.get_height() for p in ax.patches])

Барориш:

[10.0, 12.0]

Баландиҳои 10 ва 12 миёнаҳо мебошанд, на ҷамъҳои 20 ва 24. Ислоҳ: estimator="sum" диҳед. Мавҷудияти меҳвари ададӣ худ аз худ маънои ҷамъ шудани қиматҳоро надорад.

3. Баъзе категорияҳо дар order нестанд

Агар ҳамаи ҳайвонҳо лозим бошанд, ин рӯйхат нопурра аст:

fig, ax = plt.subplots()
sns.countplot(data=pets, x="pet", order=["cat"], ax=ax)
print([int(p.get_height()) for p in ax.patches])

Барориш:

[3]

Танҳо як сутун боқӣ мемонад. Ислоҳ: ҳамаи номҳои заруриро ба order дохил кунед. Ин параметр категорияҳоро ҳам ҷойиваз ва ҳам пинҳон карда метавонад.

4. Чанд график тасодуфан дар як соҳа кашида мешавад

Барои ду расми мустақил рамзи зерин нодуруст аст:

fig, ax = plt.subplots()
sns.countplot(data=pets, x="pet", ax=ax)
sns.countplot(data=pets, x="pet", ax=ax)
print(len(ax.patches))

Барориш:

6

Ба ҷойи се росткунҷа шашто ҳосил шуд: даъвати дуюм росткунҷаҳои навро болои пешинаҳо илова кард. Ислоҳ: барои ҳар расм fig, ax = plt.subplots()-и нав созед ё соҳаро бо ax.clear() тоза кунед.

Ёддошт

Вазифа Чӣ истифода шавад
Шумораи сатрҳо аз рӯи категорияҳо sns.countplot(data=df, x="category")
Миёнаи аломати ададӣ sns.barplot(data=df, x="category", y="value")
Агрегатсияи дигар estimator="sum", "median" ё "max"
Хомӯш кардани фосилаҳо errorbar=None
Муайян кардани тартиб order=[...]
Сутунҳои уфуқӣ Категория дар y, адад дар x
Санҷидани шакл ax.patches, get_height(), get_width()