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.

18 KiB

تجسم توزیع‌ها

طرح دستی توسط (@sketchthedocs)
تجسم توزیع‌ها - طرح دستی توسط @nitya

در درس قبلی، شما با برخی از حقایق جالب درباره یک مجموعه داده از پرندگان مینه‌سوتا آشنا شدید. با تجسم نقاط پرت، داده‌های اشتباه را پیدا کردید و تفاوت‌های بین دسته‌های پرندگان را بر اساس حداکثر طول آن‌ها بررسی کردید.

آزمون قبل از درس

بررسی مجموعه داده پرندگان

یکی دیگر از روش‌های کاوش در داده‌ها، بررسی توزیع آن‌ها یا نحوه سازماندهی داده‌ها در طول یک محور است. شاید بخواهید، به عنوان مثال، درباره توزیع کلی حداکثر طول بال یا حداکثر جرم بدن پرندگان مینه‌سوتا در این مجموعه داده اطلاعات کسب کنید.

بیایید برخی از حقایق مربوط به توزیع داده‌ها در این مجموعه داده را کشف کنیم. در فایل notebook.ipynb که در ریشه پوشه این درس قرار دارد، Pandas، Matplotlib و داده‌های خود را وارد کنید:

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

به طور کلی، می‌توانید با استفاده از یک نمودار پراکندگی، همان‌طور که در درس قبلی انجام دادید، به سرعت نحوه توزیع داده‌ها را مشاهده کنید:

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' برای هیستوگرام ترسیم کنید. این نمودار توزیع حداکثر جرم بدن را برای کل محدوده داده‌های عددی مجموعه داده نشان می‌دهد. با تقسیم آرایه داده‌ها به بخش‌های کوچک‌تر، می‌تواند توزیع مقادیر داده‌ها را نمایش دهد:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 10, figsize = (12,12))
plt.show()

توزیع در کل مجموعه داده

همان‌طور که می‌بینید، بیشتر از ۴۰۰ پرنده در این مجموعه داده در محدوده‌ای کمتر از ۲۰۰۰ برای حداکثر جرم بدن قرار دارند. با تغییر پارامتر bins به عددی بالاتر، مثلاً ۳۰، می‌توانید بینش بیشتری به دست آورید:

birds['MaxBodyMass'].plot(kind = 'hist', bins = 30, figsize = (12,12))
plt.show()

توزیع در کل مجموعه داده با پارامتر bins بزرگ‌تر

این نمودار توزیع را به شکلی کمی دقیق‌تر نشان می‌دهد. می‌توانید نموداری کمتر متمایل به چپ ایجاد کنید، با این کار که فقط داده‌های یک محدوده خاص را انتخاب کنید:

داده‌های خود را فیلتر کنید تا فقط پرندگانی که جرم بدن آن‌ها کمتر از ۶۰ است نشان داده شوند و ۴۰ bins نمایش دهید:

filteredBirds = birds[(birds['MaxBodyMass'] > 1) & (birds['MaxBodyMass'] < 60)]      
filteredBirds['MaxBodyMass'].plot(kind = 'hist',bins = 40,figsize = (12,12))
plt.show()     

هیستوگرام فیلتر شده

فیلترها و نقاط داده دیگری را امتحان کنید. برای مشاهده توزیع کامل داده‌ها، فیلتر ['MaxBodyMass'] را حذف کنید تا توزیع‌های برچسب‌دار نمایش داده شوند.

هیستوگرام همچنین گزینه‌های خوبی برای رنگ‌آمیزی و برچسب‌گذاری ارائه می‌دهد:

یک هیستوگرام دو بعدی ایجاد کنید تا رابطه بین دو توزیع را مقایسه کنید. بیایید MaxBodyMass و MaxLength را مقایسه کنیم. Matplotlib یک روش داخلی برای نمایش همگرایی با استفاده از رنگ‌های روشن‌تر ارائه می‌دهد:

x = filteredBirds['MaxBodyMass']
y = filteredBirds['MaxLength']

fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(x, y)

به نظر می‌رسد که یک همبستگی مورد انتظار بین این دو عنصر در امتداد یک محور مشخص وجود دارد، با یک نقطه همگرایی بسیار قوی:

نمودار دو بعدی

هیستوگرام‌ها به طور پیش‌فرض برای داده‌های عددی به خوبی کار می‌کنند. اگر بخواهید توزیع‌ها را بر اساس داده‌های متنی مشاهده کنید چه؟

بررسی توزیع‌ها در مجموعه داده با استفاده از داده‌های متنی

این مجموعه داده همچنین شامل اطلاعات خوبی درباره دسته‌بندی پرندگان، جنس، گونه، خانواده و وضعیت حفاظتی آن‌ها است. بیایید اطلاعات حفاظتی را بررسی کنیم. توزیع پرندگان بر اساس وضعیت حفاظتی آن‌ها چگونه است؟

در این مجموعه داده، چندین مخفف برای توصیف وضعیت حفاظتی استفاده شده است. این مخفف‌ها از دسته‌بندی‌های فهرست قرمز IUCN گرفته شده‌اند، سازمانی که وضعیت گونه‌ها را فهرست می‌کند.

  • CR: به شدت در معرض خطر
  • EN: در معرض خطر
  • EX: منقرض‌شده
  • LC: کمترین نگرانی
  • NT: نزدیک به تهدید
  • VU: آسیب‌پذیر

این مقادیر متنی هستند، بنابراین برای ایجاد یک هیستوگرام باید یک تبدیل انجام دهید. با استفاده از فیلتر داده‌های پرندگان، وضعیت حفاظتی آن‌ها را در کنار حداقل طول بال نمایش دهید. چه چیزی مشاهده می‌کنید؟

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، آشنا شوید.

با بارگذاری Seaborn، یک نمودار چگالی ساده را امتحان کنید:

import seaborn as sns
import matplotlib.pyplot as plt
sns.kdeplot(filteredBirds['MinWingspan'])
plt.show()

نمودار چگالی

می‌توانید ببینید که این نمودار مشابه نمودار قبلی برای داده‌های حداقل طول بال است؛ فقط کمی روان‌تر است. طبق مستندات Seaborn، "در مقایسه با یک هیستوگرام، KDE می‌تواند نموداری تولید کند که کمتر شلوغ و قابل تفسیرتر باشد، به ویژه هنگام ترسیم چندین توزیع. اما ممکن است تحریف‌هایی ایجاد کند اگر توزیع پایه محدود یا روان نباشد. مانند یک هیستوگرام، کیفیت نمایش نیز به انتخاب پارامترهای صاف‌کننده خوب بستگی دارد." منبع به عبارت دیگر، نقاط پرت همیشه باعث می‌شوند نمودارهای شما به درستی عمل نکنند.

اگر بخواهید آن خط دندانه‌دار MaxBodyMass در نمودار دوم را دوباره بررسی کنید، می‌توانید آن را با استفاده از این روش به خوبی صاف کنید:

sns.kdeplot(filteredBirds['MaxBodyMass'])
plt.show()

خط صاف‌شده جرم بدن

اگر بخواهید یک خط صاف، اما نه خیلی صاف داشته باشید، پارامتر bw_adjust را ویرایش کنید:

sns.kdeplot(filteredBirds['MaxBodyMass'], bw_adjust=.2)
plt.show()

خط کمتر صاف‌شده جرم بدن

درباره پارامترهای موجود برای این نوع نمودار مطالعه کنید و آزمایش کنید!

این نوع نمودار توضیحات بصری زیبایی ارائه می‌دهد. به عنوان مثال، با چند خط کد می‌توانید چگالی حداکثر جرم بدن را بر اساس راسته پرندگان نمایش دهید:

sns.kdeplot(
   data=filteredBirds, x="MaxBodyMass", hue="Order",
   fill=True, common_norm=False, palette="crest",
   alpha=.5, linewidth=0,
)

جرم بدن بر اساس راسته

همچنین می‌توانید چگالی چندین متغیر را در یک نمودار ترسیم کنید. حداکثر طول و حداقل طول یک پرنده را در مقایسه با وضعیت حفاظتی آن‌ها بررسی کنید:

sns.kdeplot(data=filteredBirds, x="MinLength", y="MaxLength", hue="ConservationStatus")

چگالی‌های متعدد، روی هم قرار گرفته

شاید ارزش تحقیق داشته باشد که آیا خوشه پرندگان "آسیب‌پذیر" بر اساس طول آن‌ها معنادار است یا خیر.

🚀 چالش

هیستوگرام‌ها نوعی نمودار پیشرفته‌تر نسبت به نمودارهای پراکندگی ساده، نمودارهای میله‌ای یا نمودارهای خطی هستند. در اینترنت جستجو کنید تا مثال‌های خوبی از استفاده از هیستوگرام‌ها پیدا کنید. آن‌ها چگونه استفاده می‌شوند، چه چیزی را نشان می‌دهند، و در چه زمینه‌ها یا حوزه‌هایی بیشتر مورد استفاده قرار می‌گیرند؟

آزمون پس از درس

مرور و مطالعه شخصی

در این درس، از Matplotlib استفاده کردید و شروع به کار با Seaborn برای نمایش نمودارهای پیشرفته‌تر کردید. درباره kdeplot در Seaborn، یک "منحنی چگالی احتمال پیوسته در یک یا چند بعد"، تحقیق کنید. مستندات این لینک را بخوانید تا بفهمید چگونه کار می‌کند.

تکلیف

مهارت‌های خود را اعمال کنید

سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.