Тақсимотҳо
Чаро тақсимотро меомӯзем
Маҷмӯаҳои хеле гуногун метавонанд қимати миёнаи якхела дошта бошанд: ҳамаи натиҷаҳо ба ҳам наздиканд ё нисфашон хурду нисфи дигарашон калонанд. Тақсимот тавсиф мекунад, ки кадом қиматҳо ва бо чӣ басомад вомехӯранд. Он диапазони маъмул, чанд гурӯҳи мушоҳидаҳо ва қиматҳои ғайриодиро ошкор мекунад.
Гистограмма меҳвари ададиро ба фосилаҳо ҷудо карда, мушоҳидаҳои дохили онҳоро мешуморад. boxplot тақсимотро бо медиана, квартилҳо, мӯякҳо ва нуқтаҳои алоҳида ҷамъбаст мекунад. Графики якум барои шакли тақсимот ва дуюм барои муқоисаи фишурдаи гурӯҳҳо қулай аст.
1. Фосилаҳои гистограмма
Фосила, ё bin, порчаи меҳвари ададӣ аст. Дар мисол ҳудудҳо бо рӯйхат дода шудаанд: [0, 2, 4, 6] се фосила месозад. Одатан ҳудуди чап дохил ва ҳудуди рост хориҷ аст; дар фосилаи охирин ҳар ду ҳудуд дохил мешаванд. Пас адади 2 ба фосилаи дуюм ва 6 ба фосилаи охирин меафтад.
Мисолҳоро пайдарпай дар як ҷаласа иҷро кунед. plt.subplots()-и нав расми алоҳида месозад. Дар консол шаклҳоро тавассути Axes месанҷем; plt.show() расмро дар скрипти одӣ нишон медиҳад.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
values = [0, 1, 2, 4, 5, 6]
fig, ax = plt.subplots()
sns.histplot(x=values, bins=[0, 2, 4, 6], ax=ax)
print([int(p.get_height()) for p in ax.patches])
Барориш:
[2, 1, 3]
Сутуни якум 0 ва 1, дуюм 2 ва сеюм 4, 5 ва 6-ро дар бар мегирад. Фосилаи холӣ ҳам сутун дорад, вале баландии он сифр аст. Агар адади бутуни bins=3 диҳед, seaborn аз қимати хурдтарин то калонтарин се фосилаи баробар месозад; рӯйхати ҳудудҳо назорати дақиқтар медиҳад.
binwidth ба ҷойи шумораи фосилаҳо паҳно ва binrange=(a, b) диапазони умумиро муайян мекунад.
2. Қиматҳои бутун
Агар қиматҳо танҳо ҳамчун ададҳои бутун маъно дошта бошанд, масалан шумораи хатоҳо, discrete=True фосилаҳои паҳнояшон 1 месозад, ки марказашон дар ададҳои бутун аст. Ҳудудҳо байни ададҳои ҳамсоя мегузаранд.
fig, ax = plt.subplots()
sns.histplot(x=[1, 1, 2, 4], discrete=True, ax=ax)
print([int(p.get_height()) for p in ax.patches])
Барориш:
[2, 1, 0, 1]
Баландиҳо ба қиматҳои 1, 2, 3 ва 4 мувофиқанд. Сифр дар ҷойи сеюм маънои онро дорад, ки 3 вонахӯрдааст. Ин миқёси ададӣ бо ҷойи холӣ аст, на танҳо рӯйхати категорияҳои ёфтшуда.
3. Баландӣ чӣ маъно дорад: stat
Ба таври пешфарз stat="count" шумораи мушоҳидаҳоро нишон медиҳад. Ҳисса ("proportion") шумораи дохили фосила тақсим бар шумораи умумӣ аст; фоиз ("percent") ҳисса зарби 100 мебошад. Ин барои муқоисаи интихобҳои андозаашон гуногун қулай аст.
Зичӣ ("density") паҳнои фосиларо ҳам ба ҳисоб мегирад: шумора ҳам ба шумораи умумӣ ва ҳам ба паҳно тақсим мешавад. Аз ин рӯ ҷамъи масоҳатҳо ба як баробар аст, на ҳатман ҷамъи баландиҳо.
fig, ax = plt.subplots()
sns.histplot(x=[1, 2, 6, 7], binwidth=4, binrange=(0, 8),
stat="percent", ax=ax)
print([p.get_height() for p in ax.patches])
fig, ax = plt.subplots()
sns.histplot(x=[1, 2, 6, 7], bins=[0, 4, 8], stat="density", ax=ax)
print(sum(p.get_height() * p.get_width() for p in ax.patches))
Барориш:
[50.0, 50.0]
1.0
Дар ҳар фосила аз чор мушоҳида дуто ҳаст — 50%. Дар қисми дуюм ҷамъи масоҳатҳо 1 аст. Ҳангоми паҳнои 4 баландии ҳар сутуни зичӣ 0.125 мебошад. Баландии зичӣ эҳтимоли як қимати алоҳида нест ва баъзан метавонад аз 1 зиёд бошад.
4. Гурӯҳҳои ранга ва каҷи ҳамвор
hue додаҳоро аз рӯи сутуни интихобшуда ба гурӯҳҳо ҷудо мекунад. multiple="layer" гистограммаҳоро рӯйи ҳам, "dodge" сутунҳоро паҳлуи ҳам ва "stack" болои ҳам мегузорад.
KDE арзёбии ҳамворшудаи зичӣ аст. Ба ҷойи фосилаҳо дар назди ҳар мушоҳида саҳми ҳамвор мегузоранд ва баъд саҳмҳоро ҷамъ мекунанд. kdeplot танҳо каҷро мекашад, histplot(..., kde=True) онро ба гистограмма илова мекунад.
samples = pd.DataFrame({"value": [1, 2, 3, 4, 5, 6],
"group": ["a", "a", "a", "b", "b", "b"]})
fig, ax = plt.subplots()
sns.histplot(data=samples, x="value", hue="group",
bins=[0, 4, 8], multiple="dodge", ax=ax)
print([t.get_text() for t in ax.get_legend().get_texts()])
print(len(ax.patches))
fig, ax = plt.subplots()
sns.kdeplot(x=samples["value"], ax=ax)
print(len(ax.lines))
Барориш:
['a', 'b']
4
1
Ду гурӯҳ ва чор росткунҷа ҳосил шуд: барои ҳар гурӯҳ ду фосила. Баъд як каҷи KDE сохта шуд. Ҳамвориро bw_adjust танзим мекунад: қиматҳои калон ҷузъиётро бештар ҳамвор мекунанд. Каҷ ба ин интихоб вобаста аст ва метавонад аз ҳудуди дурусти додаҳо берун равад. Барои баҳоҳои бутун аксар вақт discrete=True бе KDE фаҳмотар аст.
5. Медиана, квартилҳо ва boxplot
Медиана додаҳои мураттабшударо ба ду нисф ҷудо мекунад. Квартилҳои Q1 ва Q3 25%-и поёнӣ ва 25%-и болоиро ҷудо мекунанд; байни онҳо 50%-и миёнаи додаҳо ҷойгир аст. Фарқи IQR = Q3 - Q1 фосилаи байниквартилӣ ном дорад.
Дар boxplot-и одӣ мӯякҳо то мушоҳидаҳои канории дохили ҳудудҳои Q1 - 1.5 * IQR ва Q3 + 1.5 * IQR мерасанд. Қиматҳои берун аз ин ҳудудҳо бо нуқтаҳои алоҳида кашида мешаванд. Онҳо бояд санҷида шаванд, вале худ аз худ додаҳои хато нестанд.
fig, ax = plt.subplots()
sns.boxplot(x=["demo"] * 5, y=[1, 2, 3, 4, 20], ax=ax)
print([list(line.get_ydata()) for line in ax.lines])
Барориш:
[[2.0, 1.0], [4.0, 4.0], [1.0, 1.0], [4.0, 4.0], [3.0, 3.0], [20.0]]
Барои [1, 2, 3, 4, 20] натиҷа Q1 = 2, медиана 3, Q3 = 4 ва IQR = 2 аст. Мӯяки поёнӣ аз 2 то 1 меравад, болоӣ дар 4 мемонад. Ду хати баъдӣ нӯги мӯякҳо, панҷум медиана ва нуқтаи охирин 20 аст.
Барои муқоисаи гурӯҳҳо data=df, категорияро ба x ва ададро ба y диҳед. Параметри order тартиби қуттиҳоро муайян мекунад.
График чӣ гуна ҳисоб мешавад
Ҳангоми сохтани гистограмма аввал ҳудудҳо интихоб мешаванд, баъд ҳар адад ба фосилаи худ дохил мешавад. Шумораҳо мувофиқи stat табдил меёбанд ва matplotlib росткунҷаҳоро мекашад. Тағйири фосилаҳо намуди гистограммаро дигар мекунад, ҳатто агар ададҳои аслӣ якхела бошанд.
Барои boxplot seaborn квартилҳо, медиана ва ҳудуди мӯякҳоро дар ҳар гурӯҳ алоҳида ҳисоб мекунад. Бар хилофи barplot, қуттӣ танҳо як қимати миёнаро нишон намедиҳад. Ҳангоми муқоиса ба ҷойи медиана, баландии қуттӣ ва нуқтаҳои алоҳида якҷоя нигаред.
Хатоҳои маъмул ва ислоҳи онҳо
1. Шумораи фосилаҳоро паҳнои онҳо мешуморанд
Агар паҳнои 2 лозим бошад, bins=2 интихоби нодуруст аст:
fig, ax = plt.subplots()
sns.histplot(x=[0, 1, 2, 4, 5, 6], bins=2, ax=ax)
print([int(p.get_height()) for p in ax.patches])
Барориш:
[3, 3]
Ду фосила бо паҳнои 3 ва баландии 3 ҳосил шуд, на се фосила бо паҳнои 2. Ислоҳ: binwidth=2 ё ҳудудҳои ошкори bins=[0, 2, 4, 6]-ро истифода баред. Дохил шудани ҳудудҳо низ муҳим аст.
2. Шумораҳоро фоиз меноманд
Барои ҳисоботи фоизӣ ин рамз нопурра аст:
fig, ax = plt.subplots()
sns.histplot(x=[1, 2, 6, 7], bins=[0, 4, 8], ax=ax)
print([int(p.get_height()) for p in ax.patches])
Барориш:
[2, 2]
Барориш шумораҳои 2 ва 2-ро дорад. Ислоҳ: stat="percent" илова кунед; он гоҳ баландиҳо 50 ва 50 мешаванд. Иваз кардани номи меҳвар тарзи ҳисобро тағйир намедиҳад.
3. Хатти boxplot-ро қимати миёна мешуморанд
Мувофиқати ду адади зеринро интизор шудан нодуруст аст:
print(pd.Series([1, 2, 3, 4, 20]).mean())
print(pd.Series([1, 2, 3, 4, 20]).median())
Барориш:
6.0
3.0
Қимати миёна 6 ва медиана 3 аст. Адади 20 миёнаро хеле зиёд кард, вале хатти дохили қуттӣ дар медиана монд. Ислоҳ: ин хатро медиана номед; барои муқоисаи миёнаҳо barplot-ро интихоб кунед ё нишондиҳандаи алоҳидаро ошкоро илова намоед.
Ёддошт
| Чӣ лозим аст | Параметр ё функсия |
|---|---|
| Шумораи фосилаҳо | bins=k |
| Ҳудудҳои дақиқ | bins=[a, b, c] |
| Паҳно ва диапазон | binwidth=w, binrange=(a, b) |
| Миқёси ададҳои бутун | discrete=True |
| Шумора / ҳисса / фоиз | stat="count" / "proportion" / "percent" |
| Ҷамъи масоҳати сутунҳо баробари 1 | stat="density" |
| Гурӯҳҳо бо ранг | hue ва multiple |
| Зичии ҳамворшуда | kde=True ё sns.kdeplot(...) |
| Медиана ва парокандагии гурӯҳҳо | sns.boxplot(...) ва order |