آموزش نرم‌افزار R برای علوم داده: رسم نمودار

یکی از قابلیت‌های برجسته نرم‌افزار R این است که امکانات متنوعی را برای نمایش داده‌ها داراست. در این مقاله من به روش‌های پایه‌ای برای رسم نمودار اشاره می‌کنم که در دنیای کسب‌وکار بیشتر استفاده می‌شوند. در این مقاله صرفاً به توابع داخلی R برای نمایش داده می‌پردازم. خواننده باید بداند برای رسم نمودارهای پیشرفته‌تر بسته‌هایی مانند ggplot2 توسعه یافته‌اند که امکانات وسیع‌تری را در اختیار می‌گذارد. رویکرد من در آموزش برنامه‌نویسی R بیشتر مبتنی بر استفاده از مثال است تا خواننده با اجرای کدها بتواند این زبان را یاد بگیرد. برای اینکه در مثال های این بخش مشکلی نداشته باشید توصیه می کنم سری مقالات قبلی آموزش نرم افزار R برای علوم داده را بخوانید.

در این مقاله، من مثال هایم را عمدتا بر روی دیتا فریم mtcars اجرا کردم. در انتهای مقاله “آموزش نرم‌افزار R برای علوم داده: مباحث مقدماتی” درباره این دیتا فریم توضیح دادم.

رسم نمودار در R

ساده‌ترین حالت برای رسم نمودار استفاده از تابع plot در R است. در کد زیر، من ابتدا نمودار پراکندگی را برای دو متغیر وزن خودرو (wt) و مسافتی که خودرو برحسب مایل به ازای مصرف یک گالن (mpg) طی می‌کند، رسم کردم. در خط بعد با استفاده از تابع abline خط رگرسیون را به نمودار اضافه کردم. تابع lm در R برای محاسبه خط رگرسیون بکار می‌رود. در انتها از تابع title استفاده کردم و یک عنوان به نمودار اضافه کردم. خروجی کار را در شکل-۱ می‌بینید.

شکل-۱

رسم نمودار هیستوگرام (Histogram)

تابع hist برای رسم نمودارهای هیستوگرام بکار می‌رود. در کد زیر هیستوگرام متغیر mpg را رسم کردم. با استفاده از پارامتر break می‌توانید تنظیم کنید تا هیستوگرام دارای چند طبقه (Bin) باشد. با استفاده از پارامتر col رنگ نمودار را بر روی قرمز تنظیم کردم. خروجی کار را در شکل-۲ نشان دادم. توجه کنید تابع هیستوگرام بر اساس فرکانس وقوع (Frequency) یا تعداد حالت‌های رخ‌داده رسم شده است.

همان‌طور که می‌بینید شکل-۲ ایدئال نیست و می‌تواند بهتر شود. برای نمونه، میله‌های نمودار از حدود محور افقی بیرون زده است. در بخش بعدی با تنظیم پارامترهای تابع hist نمودار بهتری رسم می‌کنم.

اضافه کردن منحنی تابع توزیع نرمال (Normal Distribution)

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

چون تابع توزیع بر اساس چگالی (Density) رسم می‌شود، برای مقایسه کردن آن با هیستوگرام داده‌ها لازم است، نمودار هیستوگرام داده‌ها به‌جای فرکانس بر اساس  درصد وقوع به نمایش دربیاید. بنابراین پارامتر freq را در تابع hist برابر FALSE قراردادم. از xlim استفاده کردم تا حدود محور افقی را بین صفر و حداکثر مقدار متغیر mpg تنظیم کنم تا مشکل ایجادشده در شکل-۲ بروز نکند. از پارامتر xlab برای تخصیص عنوان محور افقی و از main برای تخصیص عنوان نمودار استفاده کردم.

برای آنکه نمودار نرمال را روی هیستوگرام رسم کنم، متغیر xfit را برداری از اعداد بین صفر تا حداکثر مقدار متغیر mpg تعریف کردم. این بردار ۴۰ عدد را به‌صورت یکنواخت در این بازه انتخاب می‌کند. سپس با استفاده از تابع dnorm مقادیر متناظر آن‌ها را از تابع نرمال به دست آوردم و در متغیر yfit قراردادم. درنهایت از تابع lines استفاده کردم تا منحنی نرمال را به هیستوگرام اضافه کنم. توجه کنید پارامتر lwd ضخامت خط نمودار را تعیین می‌کند. هر چه این عدد بزرگ‌تر شود، خط ضخیم‌تر خواهد بود. نتیجه این کد را در شکل-۳ می‌بینید.

شکل-۳

نمودار نقطه‌ای (Dot Plot)

شکل-۴ نمودار توزیع مدل‌های مختلف خودرو بر اساس متغیر mpg را در قالب نمودار نقطه‌ای نشان می‌دهد. از کد زیر برای رسم این نمودار استفاده کردم. در این کد، تابع dotchart را بکار بردم. برچسب محور عمودی بر اساس اسم ردیف‌ها در دیتا فریم mtcars مشخص شده است. به خاطر دارید که اسم ردیف‌های این دیتا فریم اسامی مدل‌های مختلف خودرو بود. بقیه قسمت‌های کد سرراست است.

شکل-۴

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

برای آنکه نمودارهای گویاتر و بهتری رسم کنید، پیشنهاد می‌کنم مقاله “چگونه ممکن است نمودارها شما را فریب دهند؟” را مطالعه نمایید.

یک روش بهتر برای نمایش همان داده‌ها، نمودار شکل-۵ است. در این نمودار خودروها بر اساس تعداد سیلندر (متغیر cyl) دسته‌بندی ‌شده‌اند و در هر دسته هم خودروها بر اساس میزان مصرف از بزرگ به کوچک مرتب شده‌اند.

شکل-۵

برای این منظور من ابتدا دیتا فریم x را به‌این‌ترتیب تعریف کردم که همان دیتا فریم mtcars است اما ردیف‌های آن بر اساس مقادیر متغیر mpg با استفاده از تابع order از بزرگ به کوچک مرتب شده‌اند.  سپس به دیتا فریم x یک ستون با نام color اضافه کردم که بعداً کمک خواهد کرد رنگ داده‌ها در تابع dotchart از مقادیر آن خوانده شود. این رنگ‌ها بر اساس تعداد سیلندر خودرو تخصیص داده می‌شوند. پارامتر cex سایز برچسب‌ها را پایش می‌کند (توجه کنید سایز برچسب‌ها نسبت به حالت پیش‌فرض ۳۰ درصد کمتر شده تا مشکل شکل-۴ پیش نیاید). پارامتر groups تعیین می‌کند که داده‌ها چگونه گروه‌بندی شوند و gcolor رنگ برچسب‌های گروه‌ها را مشخص می‌کند.

نمودار ستونی (Column Chart)

اگر بخواهم مشابه شکل-۶ توزیع خودروها را بر اساس تعداد دنده‌هایشان رسم کنم، بهتر است آن را در قالب نمودار ستونی نشان دهم. برای این منظور ابتدا لازم است بدانم در هر گروه چند خودرو وجود دارد. تابع table فراوانی خودروهای هر گروه را نشان می‌دهد. خروجی تابع table را در متغیر counts ذخیره کردم. همان‌طور که می‌بینید کلاس این متغیر جدول (Table) است و تعداد خودروهای سه، چهار و پنج دنده را در داده‌های mtcars مشخص می‌کند. گام بعدی استفاده از تابع barplot برای رسم این جدول است. اگر بخواهید این نمودار را به شکل افقی رسم کنید (شکل-۷)، کافی است در تابع barplot پارامتر horiz را معادل TRUE قرار دهید.

شکل-۶

شکل-۷

نمودار ستونی انباره‌ای (Stacked Column Chart)

نمودار شکل-۸ نمونه‌ای از نمودارهای ستونی انباره‌ای را نشان می‌دهد. در این نمودار علاوه بر این‌که مشخص شده است در هر گروه برحسب تعداد دنده، چند خودرو وجود دارد، نشان می‌دهد در هر گروه فراوانی خودروها برحسب این‌که نوع موتورشان V-shape هست یا نیست (۱ یا ۰) چگونه است.

شکل-۸

برای رسم این نمودار مشابه قبل ابتدا جدول فراوانی را در متغیر counts قراردادم، با این تفاوت که جدول فراوانی را بر اساس دو متغیر vs و gear تعریف کردم. به‌این‌ترتیب دسته‌بندی اصلی جدول بر اساس متغیر gear  و دسته‌بندی فرعی بر اساس متغیر vs ایجاد شده است (این‌که کدام متغیر را اول بگذارید و کدام را دوم نحوه آرایش جدول را تعیین می‌کند). نکته دیگر این‌که پارامتر legend را طوری تنظیم کردم تا راهنمای نمودار را به نمایش دربیاورد. بقیه قسمت‌های کد سرراست است.

نمودار ستونی گروهی (Grouped Column Chart)

اگر بخواهم به‌جای حالت انباره‌ای، نمودار شکل-۸ را گروهی به نمایش دربیاورم، از کد زیر استفاده می‌کنم:

نتیجه را در شکل-۹ نشان دادم.

شکل-۹

نمودار دایره‌ای (Pie Charts)

برای مثال نمودار دایره‌ای، ابتدا یک سری داده ایجاد کردم و آن‌ها را در بردار numbers قراردادم. برچسب متناظر این داده‌ها را در بردارcategory  تخصیص دادم. نمودار شکل-۱۰ نمودار دایره‌ای این داده‌ها را بر اساس فراوانی نشان می‌دهد. تابع pie برای رسم نمودار دایره‌ای استفاده می‌شود:

شکل-۱۰

با استفاده از کد زیر نمودار شکل بالا را کمی اصلاح کردم (شکل-۱۱). مهم‌ترین تغییر این است که اعداد بر اساس درصد به نمایش درآمده‌اند و برچسب‌ها هم گویاتر شده‌اند.

شکل-۱۱

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

رسم نمودار جعبه‌ای خیلی سرراست است. کافی است از تابع boxplot استفاده و مشخص کنیم با چه فرمولی می‌خواهیم نمودار جعبه‌ای را رسم کنیم. در کد زیر منبع داده‌ها، دیتا فریم mtcars است و رابطه mpg~cyl نشان می‌دهد متغیر mpg را برحسب cyl رسم کرده‌ام (شکل-۱۲):

شکل-۱۲

مقالات آموزش زبان R در آنالیکا

آموزش نرم‌افزار R برای علوم داده: مباحث مقدماتی

آموزش نرم‌افزار R برای علوم داده: خواندن و نوشتن داده‌ها

آموزش نرم‌افزار R برای علوم داده: عبارات شرطی و حلقه‌ها

آموزش نرم‌افزار R برای علوم داده: توابع

آموزش نرم‌افزار R برای علوم داده: رسم نمودار

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *