|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "0764fd4077f3f04a1d968ec371227744",
|
|
|
"translation_date": "2025-09-06T11:47:22+00:00",
|
|
|
"source_file": "3-Data-Visualization/12-visualization-relationships/README.md",
|
|
|
"language_code": "bg"
|
|
|
}
|
|
|
-->
|
|
|
# Визуализиране на връзки: Всичко за меда 🍯
|
|
|
|
|
|
| ](../../sketchnotes/12-Visualizing-Relationships.png)|
|
|
|
|:---:|
|
|
|
|Визуализиране на връзки - _Скетч от [@nitya](https://twitter.com/nitya)_ |
|
|
|
|
|
|
Продължавайки с природната насоченост на нашето изследване, нека открием интересни визуализации, които показват връзките между различните видове мед, според набор от данни, извлечен от [Министерството на земеделието на САЩ](https://www.nass.usda.gov/About_NASS/index.php).
|
|
|
|
|
|
Този набор от данни, съдържащ около 600 записа, показва производството на мед в много щати на САЩ. Например, можете да разгледате броя на колониите, добива на колония, общото производство, запасите, цената на килограм и стойността на произведения мед в даден щат за периода 1998-2012 г., като всеки ред представлява година за всеки щат.
|
|
|
|
|
|
Ще бъде интересно да визуализираме връзката между производството на мед в даден щат за година и, например, цената на меда в този щат. Алтернативно, бихте могли да визуализирате връзката между добива на мед на колония в различни щати. Този времеви обхват включва разрушителния феномен „CCD“ или „Синдром на колапс на колониите“, който за първи път е наблюдаван през 2006 г. (http://npic.orst.edu/envir/ccd.html), което прави този набор от данни особено значим за изследване. 🐝
|
|
|
|
|
|
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ds/quiz/22)
|
|
|
|
|
|
В този урок можете да използвате Seaborn, който вече сте използвали, като добра библиотека за визуализиране на връзки между променливи. Особено интересна е функцията `relplot` на Seaborn, която позволява създаването на разсейващи диаграми и линейни графики за бързо визуализиране на '[статистически връзки](https://seaborn.pydata.org/tutorial/relational.html?highlight=relationships)', което помага на анализатора на данни да разбере по-добре как променливите се свързват помежду си.
|
|
|
|
|
|
## Разсейващи диаграми
|
|
|
|
|
|
Използвайте разсейваща диаграма, за да покажете как цената на меда се е развивала година след година за всеки щат. Seaborn, чрез `relplot`, удобно групира данните по щати и показва точки за както категорийни, така и числови данни.
|
|
|
|
|
|
Нека започнем с импортиране на данните и Seaborn:
|
|
|
|
|
|
```python
|
|
|
import pandas as pd
|
|
|
import matplotlib.pyplot as plt
|
|
|
import seaborn as sns
|
|
|
honey = pd.read_csv('../../data/honey.csv')
|
|
|
honey.head()
|
|
|
```
|
|
|
Ще забележите, че данните за меда съдържат няколко интересни колони, включително година и цена на килограм. Нека изследваме тези данни, групирани по щати на САЩ:
|
|
|
|
|
|
| щат | колонии | добив/кол. | общо прод. | запаси | цена/кг | стойност | година |
|
|
|
| ----- | ------- | ---------- | ---------- | -------- | ---------- | ---------- | ------ |
|
|
|
| AL | 16000 | 71 | 1136000 | 159000 | 0.72 | 818000 | 1998 |
|
|
|
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
|
|
|
| AR | 53000 | 65 | 3445000 | 1688000 | 0.59 | 2033000 | 1998 |
|
|
|
| CA | 450000 | 83 | 37350000 | 12326000 | 0.62 | 23157000 | 1998 |
|
|
|
| CO | 27000 | 72 | 1944000 | 1594000 | 0.7 | 1361000 | 1998 |
|
|
|
|
|
|
Създайте основна разсейваща диаграма, за да покажете връзката между цената на килограм мед и щата, от който произхожда. Направете оста `y` достатъчно висока, за да покаже всички щати:
|
|
|
|
|
|
```python
|
|
|
sns.relplot(x="priceperlb", y="state", data=honey, height=15, aspect=.5);
|
|
|
```
|
|
|

|
|
|
|
|
|
Сега покажете същите данни с цветова схема, свързана с меда, за да покажете как цената се променя през годините. Можете да направите това, като добавите параметър 'hue', който показва промяната година след година:
|
|
|
|
|
|
> ✅ Научете повече за [цветовите палитри, които можете да използвате в Seaborn](https://seaborn.pydata.org/tutorial/color_palettes.html) - опитайте красива дъгова палитра!
|
|
|
|
|
|
```python
|
|
|
sns.relplot(x="priceperlb", y="state", hue="year", palette="YlOrBr", data=honey, height=15, aspect=.5);
|
|
|
```
|
|
|

|
|
|
|
|
|
С тази промяна в цветовата схема можете да видите, че има очевидна силна прогресия през годините по отношение на цената на килограм мед. Всъщност, ако разгледате примерен набор от данни, за да проверите (например за щата Аризона), можете да видите модел на увеличение на цената година след година, с малки изключения:
|
|
|
|
|
|
| щат | колонии | добив/кол. | общо прод. | запаси | цена/кг | стойност | година |
|
|
|
| ----- | ------- | ---------- | ---------- | -------- | ---------- | ---------- | ------ |
|
|
|
| AZ | 55000 | 60 | 3300000 | 1485000 | 0.64 | 2112000 | 1998 |
|
|
|
| AZ | 52000 | 62 | 3224000 | 1548000 | 0.62 | 1999000 | 1999 |
|
|
|
| AZ | 40000 | 59 | 2360000 | 1322000 | 0.73 | 1723000 | 2000 |
|
|
|
| AZ | 43000 | 59 | 2537000 | 1142000 | 0.72 | 1827000 | 2001 |
|
|
|
| AZ | 38000 | 63 | 2394000 | 1197000 | 1.08 | 2586000 | 2002 |
|
|
|
| AZ | 35000 | 72 | 2520000 | 983000 | 1.34 | 3377000 | 2003 |
|
|
|
| AZ | 32000 | 55 | 1760000 | 774000 | 1.11 | 1954000 | 2004 |
|
|
|
| AZ | 36000 | 50 | 1800000 | 720000 | 1.04 | 1872000 | 2005 |
|
|
|
| AZ | 30000 | 65 | 1950000 | 839000 | 0.91 | 1775000 | 2006 |
|
|
|
| AZ | 30000 | 64 | 1920000 | 902000 | 1.26 | 2419000 | 2007 |
|
|
|
| AZ | 25000 | 64 | 1600000 | 336000 | 1.26 | 2016000 | 2008 |
|
|
|
| AZ | 20000 | 52 | 1040000 | 562000 | 1.45 | 1508000 | 2009 |
|
|
|
| AZ | 24000 | 77 | 1848000 | 665000 | 1.52 | 2809000 | 2010 |
|
|
|
| AZ | 23000 | 53 | 1219000 | 427000 | 1.55 | 1889000 | 2011 |
|
|
|
| AZ | 22000 | 46 | 1012000 | 253000 | 1.79 | 1811000 | 2012 |
|
|
|
|
|
|
Друг начин да визуализирате тази прогресия е чрез използване на размер, вместо цвят. За потребители с цветна слепота това може да бъде по-добър вариант. Редактирайте визуализацията си, за да покажете увеличение на цената чрез увеличение на обиколката на точките:
|
|
|
|
|
|
```python
|
|
|
sns.relplot(x="priceperlb", y="state", size="year", data=honey, height=15, aspect=.5);
|
|
|
```
|
|
|
Можете да видите как размерът на точките постепенно се увеличава.
|
|
|
|
|
|

|
|
|
|
|
|
Дали това е просто случай на търсене и предлагане? Поради фактори като климатични промени и колапс на колониите, има ли по-малко наличен мед за покупка година след година, което води до увеличение на цената?
|
|
|
|
|
|
За да открием корелация между някои от променливите в този набор от данни, нека изследваме някои линейни графики.
|
|
|
|
|
|
## Линейни графики
|
|
|
|
|
|
Въпрос: Има ли ясно увеличение на цената на килограм мед година след година? Най-лесно можете да откриете това, като създадете единична линейна графика:
|
|
|
|
|
|
```python
|
|
|
sns.relplot(x="year", y="priceperlb", kind="line", data=honey);
|
|
|
```
|
|
|
Отговор: Да, с някои изключения около 2003 година:
|
|
|
|
|
|

|
|
|
|
|
|
✅ Тъй като Seaborn агрегира данните около една линия, той показва „многобройните измервания за всяка стойност на x, като изобразява средната стойност и 95% доверителен интервал около средната стойност“. [Източник](https://seaborn.pydata.org/tutorial/relational.html). Това поведение, което отнема време, може да бъде изключено, като добавите `ci=None`.
|
|
|
|
|
|
Въпрос: Ами през 2003 година, можем ли също да видим скок в предлагането на мед? Какво ще стане, ако разгледате общото производство година след година?
|
|
|
|
|
|
```python
|
|
|
sns.relplot(x="year", y="totalprod", kind="line", data=honey);
|
|
|
```
|
|
|
|
|
|

|
|
|
|
|
|
Отговор: Не съвсем. Ако разгледате общото производство, то всъщност изглежда, че се е увеличило през тази конкретна година, въпреки че като цяло количеството произведен мед намалява през тези години.
|
|
|
|
|
|
Въпрос: В такъв случай, какво би могло да е причинило този скок в цената на меда около 2003 година?
|
|
|
|
|
|
За да откриете това, можете да изследвате мрежа от фасети.
|
|
|
|
|
|
## Мрежи от фасети
|
|
|
|
|
|
Мрежите от фасети вземат един аспект от вашия набор от данни (в нашия случай можете да изберете 'година', за да избегнете твърде много фасети). Seaborn след това може да създаде графика за всяка от тези фасети на избраните x и y координати за по-лесно визуално сравнение. Изпъква ли 2003 година в този тип сравнение?
|
|
|
|
|
|
Създайте мрежа от фасети, като продължите да използвате `relplot`, както е препоръчано от [документацията на Seaborn](https://seaborn.pydata.org/generated/seaborn.FacetGrid.html?highlight=facetgrid#seaborn.FacetGrid).
|
|
|
|
|
|
```python
|
|
|
sns.relplot(
|
|
|
data=honey,
|
|
|
x="yieldpercol", y="numcol",
|
|
|
col="year",
|
|
|
col_wrap=3,
|
|
|
kind="line"
|
|
|
)
|
|
|
```
|
|
|
В тази визуализация можете да сравните добива на колония и броя на колониите година след година, една до друга, с настройка на wrap на 3 за колоните:
|
|
|
|
|
|

|
|
|
|
|
|
За този набор от данни нищо особено не изпъква по отношение на броя на колониите и техния добив, година след година и щат след щат. Има ли друг начин да се намери корелация между тези две променливи?
|
|
|
|
|
|
## Двойни линейни графики
|
|
|
|
|
|
Опитайте многолинейна графика, като наслагвате две линейни графики една върху друга, използвайки `despine` на Seaborn, за да премахнете горните и десните оси, и използвайки `ax.twinx` [взето от Matplotlib](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.twinx.html). Twinx позволява графиката да споделя оста x и да показва две оси y. Така че, изобразете добива на колония и броя на колониите, наслагвайки ги:
|
|
|
|
|
|
```python
|
|
|
fig, ax = plt.subplots(figsize=(12,6))
|
|
|
lineplot = sns.lineplot(x=honey['year'], y=honey['numcol'], data=honey,
|
|
|
label = 'Number of bee colonies', legend=False)
|
|
|
sns.despine()
|
|
|
plt.ylabel('# colonies')
|
|
|
plt.title('Honey Production Year over Year');
|
|
|
|
|
|
ax2 = ax.twinx()
|
|
|
lineplot2 = sns.lineplot(x=honey['year'], y=honey['yieldpercol'], ax=ax2, color="r",
|
|
|
label ='Yield per colony', legend=False)
|
|
|
sns.despine(right=False)
|
|
|
plt.ylabel('colony yield')
|
|
|
ax.figure.legend();
|
|
|
```
|
|
|

|
|
|
|
|
|
Докато нищо не изпъква около 2003 година, това ни позволява да завършим урока с малко по-оптимистична нотка: въпреки че като цяло броят на колониите намалява, броят на колониите се стабилизира, дори ако техният добив на колония намалява.
|
|
|
|
|
|
Напред, пчели, напред!
|
|
|
|
|
|
🐝❤️
|
|
|
## 🚀 Предизвикателство
|
|
|
|
|
|
В този урок научихте малко повече за други приложения на разсейващите диаграми и линейните мрежи, включително мрежите от фасети. Предизвикайте себе си да създадете мрежа от фасети, използвайки различен набор от данни, може би такъв, който сте използвали преди тези уроци. Обърнете внимание колко време отнема създаването им и колко внимателни трябва да бъдете относно броя на мрежите, които трябва да се изобразят, използвайки тези техники.
|
|
|
|
|
|
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ds/quiz/23)
|
|
|
|
|
|
## Преглед и самостоятелно обучение
|
|
|
|
|
|
Линейните графики могат да бъдат прости или доста сложни. Прочетете малко повече в [документацията на Seaborn](https://seaborn.pydata.org/generated/seaborn.lineplot.html) за различните начини, по които можете да ги изградите. Опитайте да подобрите линейните графики, които създадохте в този урок, с други методи, изброени в документацията.
|
|
|
## Задача
|
|
|
|
|
|
[Потопете се в кошера](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
**Отказ от отговорност**:
|
|
|
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод. |