انجمن هوش مصنوعی دانشگاه اصفهان
معرفی کتابخانه seaborn (بخش دوم)
نمودارهای توزیعی (Distributions):
یکی از مهم ترین گام ها برای تحلیل داده ها، بررسی گستردگی و پراکندگی مقادیر است. نمودار های گوناگونی برای این کار وجود دارند که مهمترین آنها نمودار هیستوگرام (Histogram) می باشد:
نمودار های DisPlot
ابتدا دیتاست "penguins" را اضافه می کنیم، سپس گستردگی مقادیر ستون "flipper_length_mm" را بررسی می کنیم:
penguins = sns.load_dataset("penguins") #load dataset
sns.displot(penguins, x="flipper_length_mm", kde=False)
زمانیکه مقدار فراپارامتر kde برابرTrue باشد، علاوه برنمودارهیستوگرام ، یک نمودار چگالی نیز خواهیم داشت:
sns.displot(penguins, x="flipper_length_mm", kde=True)
وقتیکه شما پراکندگی داده ای را بررسی کردید گام بعدی این است که از خود بپرسید وضعیت این داده نسبت به سایر مقادیر دیتاست چگونه است؟ برای پاسخ دادن به این سوال طبق دستور زیر عمل می کنیم:
sns.displot(penguins, x="flipper_length_mm", hue="sex")
همانطور که قبلا گفتیم فراپارامتر hue بسیار کاربردی است.
برای نمونه، در مثال بالا به کمک فراپارامتر hue گستردگی ستون "flipper_length_mm" را نسبت به جنسیت بررسی کردیم.
همچنین می توان نمودار بالا را به صورت زیر تجزیه کنیم:
sns.displot(penguins, x="flipper_length_mm", col="sex")
به نمودار های چگالی بالاتر اشاره ای شد، برای رسم نمودار های kde به شکل زیر عمل می کنیم:
sns.displot(penguins, x="flipper_length_mm", kind="kde")
تمام فراپارامتر هایی که در بالا آموزش داده شد برای kdeplot ها نیز بکار می روند:
sns.displot(penguins,x="flipper_length_mm",hue="sex",kind="kde",fill=True)
نمودار تابع توزیع تجربی (ecdf) یکی از ابزار های بررسی گستردگی داده است و هر نقطه در این نمودار روی محور عمودی بیانگر درصد مشاهداتی روی محور عمودی است که از آن نقطه کمتر هستند:
sns.displot(penguins, x="flipper_length_mm", kind="ecdf")
برای نمونه برآورد تابع توزیع تجربی در نقطه ی 210 حدودا برابر 70 درصد می باشد.
sns.displot(penguins, x="flipper_length_mm", hue="species", kind="ecdf")
نکته مهم نمودارهای تابع توزیع تجربی این است که به دلیل وجود روند افزایشی برای مقایسه چند ویژگی مناسب تر است.
در مثال های بالا فقط توزیع های تک متغیره و البته تک متغیره ی مشروط به متغیر دوم در نظر گرفته شده اند، ولی از این پس پراکندگی های دو متغیره مورد بررسی قرار می گیرند:
sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", cbar=True)
sns.displot(penguins, x="bill_length_mm", y="bill_depth_mm", kind="kde")
نمودار های PairPlot, PairGrid
همچنین می توان به جای تمرکز بر یک رابطه، از یک رویکرد برای تجسم پراکندگی تک متغیره ی همه ی مقادیر در یک مجموعه استفاده کرد:
sns.pairplot(penguins)
می توان در نمونه بالا نمودار های بالا مثلثی و پایین مثلثی و قطر مثلث این مجموعه را تغییر داد، مانند زیر:
g = sns.PairGrid(penguins)
g.map_upper(sns.histplot)
g.map_lower(sns.kdeplot, fill=True)
g.map_diag(sns.histplot, kde=True)
نمودارهای دسته بندی :(Categorical)
دسته بندی اطلاعات از تاثیرگذاری بالایی در تحلیل داده ها و تصمیم گیری براساس آنها برخوردار است بنابراین کتابخانه ی Seaborn این امکان را به ما میدهد که داده های خود را طبقه بندی کنیم:
نمودار های CatPlot
نمودار های cat plot دسترسی به چندین تابع در سطح محور را فراهم میکند. که رابطه بین یک متغیر عددی و یک یا چند متغیر طبقه ای را نمایش میدهد.
به وسیله متد figure() ابعاد نمودار را تعیین می کنیم. (به کمک کتابخانه ی matplotlib.pyplot):
pokemon = pd.read_csv("pokemon.csv") #load dataset
plt.figure(figsize=(10,6))
sns.catplot(y = "Type 1", kind = "count",data = pokemon)
plt.show()
برای تجسم وضعیت یک متغیر نسبت به متغیر دیگر در چند نمودار از col استفاده می کنیم:
plt.figure(figsize=(20,20))
sns.catplot(x='Generation' , y='Defense' , data=pokemon , col="Legendary")
متد jitter بزرگی جیتر را کنترل میکند یا آن را به طور کلی غیر فعال میکند:
sns.catplot(x="Generation", y="Defense", jitter=False, data=pokemon)
همانطور که پیش از این گفتیم به کمک hue می توانیم نموداری تک متغیره مشروط به متغیری دیگر داشت:
tips = pd.read_csv("tips.csv") #load dataset
sns.catplot(x="total_bill", y="day", hue="time", kind="swarm", data=tips)
نمودار box سه مقدار چارک توزیع را به همراه مقادیر شدید نشان میدهد.
sns.catplot(x="day", y="total_bill", kind="box", data=tips)
نمودار boxen شبیه نمودار جعبه ای است اما برای نمایش اطلاعات بیشتر در مورد شکل توزیع بهینه شده است:
diamonds = sns.load_dataset("diamonds") #load dataset
sns.catplot(x="color", y="price", kind="boxen",
data=diamonds.sort_values("color"))
به کمک violin میتوانید از تخمین تراکم هسته برای نشان دادن توزیع اساسی که از آن نقطه نمونه برداری میشود, استفاده کنید:
plt.figure(figsize=(7,7))
sns.catplot(x="Generation", y = "Speed", kind="violin", data=pokemon)
plt.show()
فراپارامتر split ولیون ها را زمانی که فراپارامتر hueدو سطح دارد، میتوان تقسیم کرد بصورتی که میتواند استفاده بهینه تر از فضا را امکان پذیر کند:
sns.catplot(x="day", y="total_bill", hue="sex", kind="violin", split=True, data=tips)
ترکیب swarmplot با نمودار جعبه ای یا ویولن برای نمایش هر مشاهده همراه با خلاصه ای از توزیع میتواند مفید باشد.
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)
ادامه مطلب را در قسمت بعد بخوانید ...
انجمن هوش مصنوعی دانشگاه اصفهان
محمد جعفرپور
مریم سادات صفوی
دانیال توکلی
مطلبی دیگر از این انتشارات
معرفی کتابخانه Pandas در پایتون
مطلبی دیگر از این انتشارات
پردازش زبان طبیعی (NLP)
مطلبی دیگر از این انتشارات
هوشِ بازیها