You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
18 KiB
216 lines
18 KiB
<!--
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
{
|
|
"original_hash": "87faccac113d772551486a67a607153e",
|
|
"translation_date": "2025-08-24T22:36:14+00:00",
|
|
"source_file": "3-Data-Visualization/10-visualization-distributions/README.md",
|
|
"language_code": "fa"
|
|
}
|
|
-->
|
|
# تجسم توزیعها
|
|
|
|
| ](../../sketchnotes/10-Visualizing-Distributions.png)|
|
|
|:---:|
|
|
| تجسم توزیعها - _طرح دستی توسط [@nitya](https://twitter.com/nitya)_ |
|
|
|
|
در درس قبلی، شما با برخی از حقایق جالب درباره یک مجموعه داده از پرندگان مینهسوتا آشنا شدید. با تجسم نقاط پرت، دادههای اشتباه را پیدا کردید و تفاوتهای بین دستههای پرندگان را بر اساس حداکثر طول آنها بررسی کردید.
|
|
|
|
## [آزمون قبل از درس](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/18)
|
|
## بررسی مجموعه داده پرندگان
|
|
|
|
یکی دیگر از روشهای کاوش در دادهها، بررسی توزیع آنها یا نحوه سازماندهی دادهها در طول یک محور است. شاید بخواهید، به عنوان مثال، درباره توزیع کلی حداکثر طول بال یا حداکثر جرم بدن پرندگان مینهسوتا در این مجموعه داده اطلاعات کسب کنید.
|
|
|
|
بیایید برخی از حقایق مربوط به توزیع دادهها در این مجموعه داده را کشف کنیم. در فایل _notebook.ipynb_ که در ریشه پوشه این درس قرار دارد، Pandas، Matplotlib و دادههای خود را وارد کنید:
|
|
|
|
```python
|
|
import pandas as pd
|
|
import matplotlib.pyplot as plt
|
|
birds = pd.read_csv('../../data/birds.csv')
|
|
birds.head()
|
|
```
|
|
|
|
| | نام | نام علمی | دستهبندی | راسته | خانواده | جنس | وضعیت حفاظتی | حداقل طول | حداکثر طول | حداقل جرم بدن | حداکثر جرم بدن | حداقل طول بال | حداکثر طول بال |
|
|
| ---: | :--------------------------- | :--------------------- | :-------------------- | :----------- | :------- | :---------- | :----------------- | --------: | --------: | ----------: | ----------: | ----------: | ----------: |
|
|
| 0 | اردک سوتزن شکمسیاه | Dendrocygna autumnalis | اردکها/غازها/آبزیان | Anseriformes | Anatidae | Dendrocygna | LC | 47 | 56 | 652 | 1020 | 76 | 94 |
|
|
| 1 | اردک سوتزن قهوهای | Dendrocygna bicolor | اردکها/غازها/آبزیان | Anseriformes | Anatidae | Dendrocygna | LC | 45 | 53 | 712 | 1050 | 85 | 93 |
|
|
| 2 | غاز برفی | Anser caerulescens | اردکها/غازها/آبزیان | Anseriformes | Anatidae | Anser | LC | 64 | 79 | 2050 | 4050 | 135 | 165 |
|
|
| 3 | غاز راس | Anser rossii | اردکها/غازها/آبزیان | Anseriformes | Anatidae | Anser | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 |
|
|
| 4 | غاز پیشانیسفید بزرگ | Anser albifrons | اردکها/غازها/آبزیان | Anseriformes | Anatidae | Anser | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |
|
|
|
|
به طور کلی، میتوانید با استفاده از یک نمودار پراکندگی، همانطور که در درس قبلی انجام دادید، به سرعت نحوه توزیع دادهها را مشاهده کنید:
|
|
|
|
```python
|
|
birds.plot(kind='scatter',x='MaxLength',y='Order',figsize=(12,8))
|
|
|
|
plt.title('Max Length per Order')
|
|
plt.ylabel('Order')
|
|
plt.xlabel('Max Length')
|
|
|
|
plt.show()
|
|
```
|
|

|
|
|
|
این نمودار نمای کلی از توزیع عمومی طول بدن بر اساس راسته پرندگان ارائه میدهد، اما بهترین روش برای نمایش توزیعهای واقعی نیست. این کار معمولاً با ایجاد یک هیستوگرام انجام میشود.
|
|
|
|
## کار با هیستوگرامها
|
|
|
|
Matplotlib روشهای بسیار خوبی برای تجسم توزیع دادهها با استفاده از هیستوگرامها ارائه میدهد. این نوع نمودار شبیه به نمودار میلهای است که در آن توزیع از طریق افزایش و کاهش میلهها قابل مشاهده است. برای ساخت یک هیستوگرام، به دادههای عددی نیاز دارید. برای ساخت یک هیستوگرام، میتوانید نموداری با نوع 'hist' برای هیستوگرام ترسیم کنید. این نمودار توزیع حداکثر جرم بدن را برای کل محدوده دادههای عددی مجموعه داده نشان میدهد. با تقسیم آرایه دادهها به بخشهای کوچکتر، میتواند توزیع مقادیر دادهها را نمایش دهد:
|
|
|
|
```python
|
|
birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12))
|
|
plt.show()
|
|
```
|
|

|
|
|
|
همانطور که میبینید، بیشتر از ۴۰۰ پرنده در این مجموعه داده در محدودهای کمتر از ۲۰۰۰ برای حداکثر جرم بدن قرار دارند. با تغییر پارامتر `bins` به عددی بالاتر، مثلاً ۳۰، میتوانید بینش بیشتری به دست آورید:
|
|
|
|
```python
|
|
birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12))
|
|
plt.show()
|
|
```
|
|

|
|
|
|
این نمودار توزیع را به شکلی کمی دقیقتر نشان میدهد. میتوانید نموداری کمتر متمایل به چپ ایجاد کنید، با این کار که فقط دادههای یک محدوده خاص را انتخاب کنید:
|
|
|
|
دادههای خود را فیلتر کنید تا فقط پرندگانی که جرم بدن آنها کمتر از ۶۰ است نشان داده شوند و ۴۰ `bins` نمایش دهید:
|
|
|
|
```python
|
|
filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)]
|
|
filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12))
|
|
plt.show()
|
|
```
|
|

|
|
|
|
✅ فیلترها و نقاط داده دیگری را امتحان کنید. برای مشاهده توزیع کامل دادهها، فیلتر `['MaxBodyMass']` را حذف کنید تا توزیعهای برچسبدار نمایش داده شوند.
|
|
|
|
هیستوگرام همچنین گزینههای خوبی برای رنگآمیزی و برچسبگذاری ارائه میدهد:
|
|
|
|
یک هیستوگرام دو بعدی ایجاد کنید تا رابطه بین دو توزیع را مقایسه کنید. بیایید `MaxBodyMass` و `MaxLength` را مقایسه کنیم. Matplotlib یک روش داخلی برای نمایش همگرایی با استفاده از رنگهای روشنتر ارائه میدهد:
|
|
|
|
```python
|
|
x = filteredBirds['MaxBodyMass']
|
|
y = filteredBirds['MaxLength']
|
|
|
|
fig, ax = plt.subplots(tight_layout=True)
|
|
hist = ax.hist2d(x, y)
|
|
```
|
|
به نظر میرسد که یک همبستگی مورد انتظار بین این دو عنصر در امتداد یک محور مشخص وجود دارد، با یک نقطه همگرایی بسیار قوی:
|
|
|
|

|
|
|
|
هیستوگرامها به طور پیشفرض برای دادههای عددی به خوبی کار میکنند. اگر بخواهید توزیعها را بر اساس دادههای متنی مشاهده کنید چه؟
|
|
|
|
## بررسی توزیعها در مجموعه داده با استفاده از دادههای متنی
|
|
|
|
این مجموعه داده همچنین شامل اطلاعات خوبی درباره دستهبندی پرندگان، جنس، گونه، خانواده و وضعیت حفاظتی آنها است. بیایید اطلاعات حفاظتی را بررسی کنیم. توزیع پرندگان بر اساس وضعیت حفاظتی آنها چگونه است؟
|
|
|
|
> ✅ در این مجموعه داده، چندین مخفف برای توصیف وضعیت حفاظتی استفاده شده است. این مخففها از [دستهبندیهای فهرست قرمز IUCN](https://www.iucnredlist.org/) گرفته شدهاند، سازمانی که وضعیت گونهها را فهرست میکند.
|
|
>
|
|
> - CR: به شدت در معرض خطر
|
|
> - EN: در معرض خطر
|
|
> - EX: منقرضشده
|
|
> - LC: کمترین نگرانی
|
|
> - NT: نزدیک به تهدید
|
|
> - VU: آسیبپذیر
|
|
|
|
این مقادیر متنی هستند، بنابراین برای ایجاد یک هیستوگرام باید یک تبدیل انجام دهید. با استفاده از فیلتر دادههای پرندگان، وضعیت حفاظتی آنها را در کنار حداقل طول بال نمایش دهید. چه چیزی مشاهده میکنید؟
|
|
|
|
```python
|
|
x1 = filteredBirds.loc[filteredBirds.ConservationStatus=='EX', 'MinWingspan']
|
|
x2 = filteredBirds.loc[filteredBirds.ConservationStatus=='CR', 'MinWingspan']
|
|
x3 = filteredBirds.loc[filteredBirds.ConservationStatus=='EN', 'MinWingspan']
|
|
x4 = filteredBirds.loc[filteredBirds.ConservationStatus=='NT', 'MinWingspan']
|
|
x5 = filteredBirds.loc[filteredBirds.ConservationStatus=='VU', 'MinWingspan']
|
|
x6 = filteredBirds.loc[filteredBirds.ConservationStatus=='LC', 'MinWingspan']
|
|
|
|
kwargs = dict(alpha=0.5, bins=20)
|
|
|
|
plt.hist(x1, **kwargs, color='red', label='Extinct')
|
|
plt.hist(x2, **kwargs, color='orange', label='Critically Endangered')
|
|
plt.hist(x3, **kwargs, color='yellow', label='Endangered')
|
|
plt.hist(x4, **kwargs, color='green', label='Near Threatened')
|
|
plt.hist(x5, **kwargs, color='blue', label='Vulnerable')
|
|
plt.hist(x6, **kwargs, color='gray', label='Least Concern')
|
|
|
|
plt.gca().set(title='Conservation Status', ylabel='Min Wingspan')
|
|
plt.legend();
|
|
```
|
|
|
|

|
|
|
|
به نظر نمیرسد که همبستگی خوبی بین حداقل طول بال و وضعیت حفاظتی وجود داشته باشد. از این روش برای بررسی عناصر دیگر مجموعه داده استفاده کنید. میتوانید فیلترهای مختلفی را نیز امتحان کنید. آیا همبستگیای پیدا میکنید؟
|
|
|
|
## نمودارهای چگالی
|
|
|
|
ممکن است متوجه شده باشید که هیستوگرامهایی که تاکنون بررسی کردهایم، "پلهای" هستند و به صورت یک قوس روان جریان ندارند. برای نمایش یک نمودار چگالی روانتر، میتوانید از نمودار چگالی استفاده کنید.
|
|
|
|
برای کار با نمودارهای چگالی، با یک کتابخانه جدید برای ترسیم، [Seaborn](https://seaborn.pydata.org/generated/seaborn.kdeplot.html)، آشنا شوید.
|
|
|
|
با بارگذاری Seaborn، یک نمودار چگالی ساده را امتحان کنید:
|
|
|
|
```python
|
|
import seaborn as sns
|
|
import matplotlib.pyplot as plt
|
|
sns.kdeplot(filteredBirds['MinWingspan'])
|
|
plt.show()
|
|
```
|
|

|
|
|
|
میتوانید ببینید که این نمودار مشابه نمودار قبلی برای دادههای حداقل طول بال است؛ فقط کمی روانتر است. طبق مستندات Seaborn، "در مقایسه با یک هیستوگرام، KDE میتواند نموداری تولید کند که کمتر شلوغ و قابل تفسیرتر باشد، به ویژه هنگام ترسیم چندین توزیع. اما ممکن است تحریفهایی ایجاد کند اگر توزیع پایه محدود یا روان نباشد. مانند یک هیستوگرام، کیفیت نمایش نیز به انتخاب پارامترهای صافکننده خوب بستگی دارد." [منبع](https://seaborn.pydata.org/generated/seaborn.kdeplot.html) به عبارت دیگر، نقاط پرت همیشه باعث میشوند نمودارهای شما به درستی عمل نکنند.
|
|
|
|
اگر بخواهید آن خط دندانهدار MaxBodyMass در نمودار دوم را دوباره بررسی کنید، میتوانید آن را با استفاده از این روش به خوبی صاف کنید:
|
|
|
|
```python
|
|
sns.kdeplot(filteredBirds['MaxBodyMass'])
|
|
plt.show()
|
|
```
|
|

|
|
|
|
اگر بخواهید یک خط صاف، اما نه خیلی صاف داشته باشید، پارامتر `bw_adjust` را ویرایش کنید:
|
|
|
|
```python
|
|
sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2)
|
|
plt.show()
|
|
```
|
|

|
|
|
|
✅ درباره پارامترهای موجود برای این نوع نمودار مطالعه کنید و آزمایش کنید!
|
|
|
|
این نوع نمودار توضیحات بصری زیبایی ارائه میدهد. به عنوان مثال، با چند خط کد میتوانید چگالی حداکثر جرم بدن را بر اساس راسته پرندگان نمایش دهید:
|
|
|
|
```python
|
|
sns.kdeplot(
|
|
data=filteredBirds, x="MaxBodyMass", hue="Order",
|
|
fill=True, common_norm=False, palette="crest",
|
|
alpha=.5, linewidth=0,
|
|
)
|
|
```
|
|
|
|

|
|
|
|
همچنین میتوانید چگالی چندین متغیر را در یک نمودار ترسیم کنید. حداکثر طول و حداقل طول یک پرنده را در مقایسه با وضعیت حفاظتی آنها بررسی کنید:
|
|
|
|
```python
|
|
sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")
|
|
```
|
|
|
|

|
|
|
|
شاید ارزش تحقیق داشته باشد که آیا خوشه پرندگان "آسیبپذیر" بر اساس طول آنها معنادار است یا خیر.
|
|
|
|
## 🚀 چالش
|
|
|
|
هیستوگرامها نوعی نمودار پیشرفتهتر نسبت به نمودارهای پراکندگی ساده، نمودارهای میلهای یا نمودارهای خطی هستند. در اینترنت جستجو کنید تا مثالهای خوبی از استفاده از هیستوگرامها پیدا کنید. آنها چگونه استفاده میشوند، چه چیزی را نشان میدهند، و در چه زمینهها یا حوزههایی بیشتر مورد استفاده قرار میگیرند؟
|
|
|
|
## [آزمون پس از درس](https://purple-hill-04aebfb03.1.azurestaticapps.net/quiz/19)
|
|
|
|
## مرور و مطالعه شخصی
|
|
|
|
در این درس، از Matplotlib استفاده کردید و شروع به کار با Seaborn برای نمایش نمودارهای پیشرفتهتر کردید. درباره `kdeplot` در Seaborn، یک "منحنی چگالی احتمال پیوسته در یک یا چند بعد"، تحقیق کنید. مستندات [این لینک](https://seaborn.pydata.org/generated/seaborn.kdeplot.html) را بخوانید تا بفهمید چگونه کار میکند.
|
|
|
|
## تکلیف
|
|
|
|
[مهارتهای خود را اعمال کنید](assignment.md)
|
|
|
|
**سلب مسئولیت**:
|
|
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. |