کتابخانه Seaborn برای مصورسازی داده در پایتون: بخش دوم

مقدمه

Seaborn را در این مقاله مورد توجه قرار می دهیم که یک کتابخانه بسیار مفید مصورسازی داده در پایتون محسوب می گردد. کتابخانه Seaborn روی Matplotlib ساخته می شود و قابلیت های پیشرفته بسیاری در رابطه با مصورسازی داده ارائه می کند.

در مقاله قبلی نحوه استفاده از کتابخانه Seaborn برای رسم نمودارهای توزیعی را مورد بررسی قرار دادیم. در این مقاله نحوه رسم نمودارهای دسته ای(categorical) مورد توجه قرار خواهد گرفت.

نمودارهای دسته ای (Categorical Plots)

نمودارهای دسته ای، همان گونه که از نامشان برمی آید، معمولاً برای رسم نمودار داده های دسته ای مورد استفاده واقع می شوند. رسم نمودار در نمودارهای دسته ای، به صورت رسم مقادیر یک ستون دسته ای نسبت به یک ستون دسته ای دیگر یا یک ستون عددی است. اکنون بیایید نگاهی به برخی از متداول ترین نمودار داده های دسته ای داشته باشیم.

نمودار میله ای (Bar Plot)

از تابع barplot برای نمایش مقدار میانگین هر مقدار موجود در یک ستون دسته ای نسبت به یک ستون عددی استفاده میشود. پارامتر اول نام ستون دسته ای و پارامتر دوم نام ستون عددی است. داده ها را با استفاده از پارامتر data به تابع میدهیم. مثلاً، اگر بخواهید مقدار میانگین سن مسافران مذکر و مونث را بدانید، نمودار میله ای را همچون قسمت زیر می توانید مورد استفاده قرار دهید.

sns.barplot(x='sex', y='age', data=dataset)

خروجی، به روشنی نشان می دهد که میانگین سن مسافران مذکر، نزدیک 40 است، در حالی که میانگین سن مسافران مونث، حدود 33 سال است.

نمودار میله ای را علاوه بر یافتن میانگین، جهت محاسبه دیگر مقادیر تجمیعی (Aggregate value) هر دسته نیز می توان بکار برد. انجام این کار نیازمند ارسال تابع تجمیعی (Aggregate Function) به پارامتر estimator است. برای نمونه، انحراف معیار سن هر جنسیت را به صورت زیر میتوانید محاسبه کنید:

 

import numpy as np

import matplotlib.pyplot as plt  
import seaborn as sns

sns.barplot(x='sex', y='age', data=dataset, estimator=np.std)

توجه داشته باشید که در اسکریپت بالا، تابع تجمیعی std کتابخانه numpy را جهت محاسبه انحراف معیار سن مسافران مذکر و مونث استفاده می کنیم. خروجی، چیزی شبیه مورد زیر است:

نمودار شمارشی (Count Plot)

نمودار شمارشی مشابه نمودار میله ای است، اما، شمار دسته های یک ستون ویژه را نمایش میدهد. برای نمونه، چنانچه بخواهید تعداد افراد مذکر و مسافران زن را بشماریم، این کار را با استفاده از نمودار شمارشی به صورت زیر انجام می دهیم:

sns.countplot(x='sex', data=dataset)

 

نمودار جعبه ای (Box Plot)

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

جزئیات بیشتر در مورد چارک ها و نمودارهای جعبه را در این لینک می توانید مطالعه نمایید.

اکنون بیایید یک نمودار جعبه ای را رسم کنیم که توزیع سن را با توجه به هر جنسیت نمایش می دهد. شما باید ستون دسته ای را به عنوان پارامتر نخست (که در مورد ما، جنسیت است) و ستون عددی (سن، در مورد ما) را به عنوان پارامتر دوم ارسال نمایید. دست آخر اینکه، دادگان، به عنوان پارامتر سوم ارسال می گردد، نگاهی به اسکریپت زیر بیندازید:

sns.boxplot(x='sex', y='age', data=dataset)

 

حال بیایید سعی کنیم درکی از نمودار جعبه ای افراد مونث داشته باشیم. چارک نخست، حدود 5 آغاز می شود و در 22 خاتمه پیدا میکند که بدین معناست که %25 مسافران دارای سن بین 5 و 25 سال هستند. چارک دوم، حدود 23 آغاز می شود و حدود 32 خاتمه می یابد، یعنی %25 مسافران در سن بین 23 و 32 قرار دارند. به همین ترتیب، آغاز و پایان چارک سوم بین 34 و42 است، ازا این رو، %25 مسافرین دارای این محدوده سنی هستند و سرانجام چارک چهارم یا آخر، در 43 آغاز می شود و حدود 65 خاتمه پیدا می کند.

خطوط بالا و پایین (wishker) نمودار به فاصله ۱.۵ برابر دامنه بین چارکی (Interqurtile range, IQR) یا فاصله بین صدم ۷۵ و صدم ۲۵، بالا و پایین جعبه رسم میشوند. مقادیر خارج از این بازه (بالا و پایین خط ها) به عنوان داده پرت تلقی میشوند.

چنانچه نقاط دورافتاده یا پرت وجود داشته باشند به واسطه ی نقاط (dots) روی نمودار جعبه ای نشان داده می شوند.

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

sns.boxplot(x='sex', y='age', data=dataset, hue="survived")

 

اکنون، علاوه بر اطلاعات مربوط به سن هر جنسیت، توزیع مسافران زنده مانده را نیز می توانید مشاهده نمایید. مثلاً شما میتوانید ببینید که در میان مسافران مذکر، به طور متوسط، افراد جوان تر بیشتری در مقایسه با افراد مسن تر زنده ماندند. به همین ترتیب شما می توانید ببینید که تنوع سنی در میان مسافران مونثی که زنده نماندند نسبت به مسافران مونث زنده مانده، بسیار بیشتر بود.

نمودار ویولنی (Violin Plot)

نمودار ویولنی شبیه نمودار جعبه ای است، ولی، این نمودار، امکان نمایش کلیه ی مولفه های دارای تناظر واقعی با نقطه داده را برای ما میسر می سازد. تابع violinplot()، جهت رسم نمودار ویولنی مورد استفاده قرار می گیرد. این نمودار، همچون نمودار جعبه ای دارای ستون دسته ای به عنوان پارامتر نخست، ستون عددی به عنوان پارامتر دوم و دادگان به عنوان پارامتر سوم است.

اکنون بیایید یک نمودار ویولنی رسم کنیم که توزیع سن را با توجه به هر جنسیت نمایش می دهد.

sns.violinplot(x='sex', y='age', data=dataset)

با توجه به شکل بالا در می یابید که نمودارهای ویولنی، در مقایسه با نمودار جعبه ای، اطلاعات بسیار بیشتری را در رابطه با داده ها ارائه می کنند. نمودار ویولنی، به جای رسم چارک، مشاهده ی تمامی مولفه های دارای تناظر واقعی با داده ها را برایمان میسر می سازد. ناحیه ای که در آن، نمودار ویولنی، ضخیم تر است، از تعداد نمونه های سنی بیشتری برخوردار است. برای نمونه، این امر در نمودار ویولنی افراد مذکر به روشنی مشهود است که تعداد مسافران دارای سن بین 20 و 40 سال، از تمام مابقی رده های سنی بیشتر است.

شما، همچون نمودارهای جعبه ای می توانید دیگر متغیر دسته ای را با استفاده از پارامتر hue که در شکل زیر نشان داده می شود، به نمودار ویولنی اضافه نمایید:

sns.violinplot(x='sex', y='age', data=dataset, hue='survived')

 

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

شما، به جای رسم دو گراف متفاوت برای مسافرانی که زنده ماندند و مسافرانی که جان سالم بدر نبردند، می توانید یک نمودار ویولنی داشته باشید که به دو نیم تقسیم شده است که یک نیم آن، مسافران زنده مانده را نشان می دهد و نیم دیگر، مسافرانی را نشان می دهد که جان سالم بدر نبردند. انجام این کار مستلزم ارسال True به عنوان مقدار برای پارامتر Split تابع violinplot است. حال بیایید ببینیم که ما چطور این کار را انجام می دهیم:

sns.violinplot(x='sex', y='age', data=dataset, hue='survived', split=True)

 

اکنون مقایسه بین سن مسافران زنده مانده و مسافران جان سالم بدر نبرده ی هم افراد مذکر و هم افراد مونث را به وضوح می توانید مشاهده کنید.

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

نمودار نواری (Strip Plot)

نمودار نواری، یک نمودار پراکندگی با نقاط پراکنده (Scatter Plot) را رسم می کند که یکی از متغیرهای آن، دسته ای است. نمودارهای پراکندگی را در بخش های نمودار مشترک و نمودار جفتی که دو متغیر عددی در آن ها داشتیم، مشاهده کرده ایم. نمودار نواری، از این حیث متفاوت است که یکی از متغیرها در این مورد، دسته ای است و نمودار پراکندگی را با توجه به ستون عددی برای هر دسته در متغیر دسته ای مشاهده خواهید کرد.

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

sns.stripplot(x='sex', y='age', data=dataset)

 

نمودارهای پراکندگی سن هم افراد مذکر و هم افراد مونث را می توانید مشاهده نمایید. نقاط داده شبیه نوار بنظر می رسند. درک توزیع داده به این شکل، دشوار است. جهت درک بهتر این داده ها، True را برای پارامتر jitter ارسال نمایید که نویز تصادفی را به داده ها اضافه می کند. اسکریپت زیر را ببینید:

sns.stripplot(x='sex', y='age', data=dataset, jitter=True)

 

اکنون نمای بهتری در مورد توزیع سن هر دو جنسیت دارید.

شما در این نمودار، همچون نمودارهای ویولنی و جعبه ای، یک ستون دسته ای دیگر را با استفاده از پارامتر hue، همان طور که در شکل زیر نشان داده می شود، به نمودار نواری اضافه می کنید:

sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived')

 

همچنین، نقاط بیشتر نزدیک به انتهای نمودار را برای افراد مذکر زنده مانده در مقایسه با افراد مذکری که جان سالم بدر نبردند مشاهده می کنید.

نمودارهای نواری را نیز همچون نمودارهای ویولنی به دو بخش تقسیم می کنیم. اسکریپت زیر را اجرا نمایید:

sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived', split=True)

 

حال، تفاوت توزیع سن هم مسافران مذکر و هم مسافران مونث زنده مانده و آنان که جان سالم بدر نبردند را به روشنی می توانید مشاهده نمایید.

نمودار ازدحامی (Swarm Plot)

نمودار ازدحامی، ترکیبی از نمودارهای نواری و ویولنی است. نقاط، در نمودارهای ازدحامی، به طریقی تنظیم می گردند (Adjust) که همپوشانی ندارند. حال بیایید یک نمودار ازدحامی را برای توزیع سن نسبت به جنسیت رسم نماییم. تابع swarmplot، جهت رسم نمودار ویولنی مورد استفاده قرار میگیرد. پارامترها در این نمودار، همچون نمودار جعبه ای، بدین صورت است که ستون دسته ای، پارامتر نخست و ستون عدددی، پارامتر دوم است، در حالی که دادگان، پارامتر سوم را تشکیل می دهد. نگاهی به اسکریپت زیر بیندازید:

sns.swarmplot(x='sex', y='age', data=dataset)

 

شما می توانید به روشنی مشاهده نمایید که نمودار بالا حاوی نقاط داده پراکنده مشابه نمودار نواری است و این نقاط داده همپوشانی ندارند. بلکه آن ها جهت دادن نمایی شبیه نمای یک نمودار ویولنی آرایش می یابند.

اکنون اجازه دهید ستون دسته ای دیگری را با استفاده از پارامتر hue، به نمودار نواری اضافه نماییم.

sns.swarmplot(x='sex', y='age', data=dataset, hue='survived')

 

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

نمودارهای ازدحامی را همچون نمودارهای نواری و جعبه ای، به دو بخش می توانیم تقسیم نماییم. اسکریپت زیر را جهت انجام این کار، اجرا نمایید:

sns.swarmplot(x='sex', y='age', data=dataset, hue='survived', split=True)

 

حال به وضوح می توان مشاهده نمود که تعداد زنانی که زنده ماندند نسبت به تعداد مردانی که جان سالم بدر بردند، بیشتر است.

ترکیب نمودارهای ازدحامی و ویولنی

نمودارهای ازدحامی، در صورت داشتن دادگان زیاد (huge)، توصیه نمی شوند، چرا که کار مقیاس گذاری را به خوبی انجام نمی دهند، چون مجبور به رسم هر نقطه داده هستند. اگر واقعاً خواهان استفاده از نمودارهای ازدحامی هستید، بهترین راه، ترکیب دو نمودار است. مثلاً، برای ترکیب یک نمودار ویولنی با نمودار ازدحامی، اسکریپت زیر را باید اجرا نمایید:

sns.violinplot(x='sex', y='age', data=dataset)  
sns.swarmplot(x='sex', y='age', data=dataset, color='black')

 

این مطلب ادامه دارد …

آیا سوالی دارید؟

سوال خود را در بخش نظرات بپرسید، سعی میکنم به آنها جواب مناسب بدم.

دیدگاهتان را بنویسید