آموزش زبان 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 رسم کرده‌ام (شکل-۱۲):

شکل-۱۲

چنین نموداری می‌تواند رابطه بین یک متغیر پیوسته (mpg – به ازای هر گالن بنزین، خودرو چند مایل طی می‌کند) با یک متغیر رسته‌ای (cyl – تعداد سیلندر خودرو) را به‌خوبی نشان دهد. در این مثال به نظر می‌رسد هر چه تعداد سیلندر خودرو افزایش یابد، mpg به‌طورکلی کاهش می‌یابد. به‌عبارت‌دیگر خودروهای با سیلندر پایین‌تر، درمجموع کارایی مصرف سوخت بهتری دارند.

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

همان‌طور که مشخص است در نمودار جعبه‌ای به‌صورت پیش‌فرض میانگین داده‌ها در نمودار به نمایش گذاشته نمی‌شود. بخصوص در مورد داده‌هایی که چولگی دارند، خوب است در نمودار جعبه‌ای علاوه بر میانه داده‌ها (خط وسط جعبه)، میانگین هم به نمایش داده شود. در کد زیر، من با تابع tapply در R میانگین داده‌ها را در ستون mpg بر اساس تعداد سیلندر خودرو محاسبه کردم. برای مثال، نتایج زیر نشان می‌دهد میانگین mpg برای خودروهای ۴ سیلندر ۲۶٫۷ است.

حال که میانگین mpg در گروه‌های مختلف را دارم، می‌توانم از تابع points برای نمایش میانگین روی نمودار قبلی با نقاط قرمزرنگ استفاده کنم. در تابع points کافی است مختصات نقاط میانگین در فضای دکارتی را مشخص کنیم. خروجی در شکل-۱۳ آمده است.

شکل-۱۳

نمودار پله‌ای (Step Plot)

برای رسم نمودار پله‌ای می‌توان از همان تابع lines که در بالا معرفی شد، استفاده کرد. برای این منظور من داده‌هایی را در x و y شبیه‌سازی کردم که ماهیت پله‌ای دارند. بردار x بیست عدد بین ۰ تا ۵ است که با فاصله یکسان از یکدیگر هستند و y به ازای هر پنج عدد در x، یک مقدار ثابت است. من ابتدا x و y  را در قالب نمودار پراکندگی رسم کردم و سپس برای رسم تابع پله‌ای از تابع lines استفاده کردم. در تابع lines کافی است type را معادل s قرار دهید. بقیه موارد سرراست است.

شکل-۱۴

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

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

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

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

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

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

16 نظر در “آموزش زبان R برای علوم داده: رسم نمودار

  • اسفند ۱۵, ۱۳۹۷ در ۸:۳۰ ب٫ظ
    پیوند یکتا

    ممنون از مطالبی که برای آموزش R گذاشته اید.

    پاسخ
  • آبان ۱۸, ۱۳۹۸ در ۹:۰۴ ب٫ظ
    پیوند یکتا

    سلام
    خیلی ممنون از مطالبی که گذاشتید. خلاصه و مفید بودش.
    خیلی ممنون میشم این سلسله مطالب ادامه داشته باشه و مطالب پیشرفته تری بذارید.
    با تشکر

    پاسخ
  • خرداد ۲۷, ۱۳۹۹ در ۲:۱۹ ب٫ظ
    پیوند یکتا

    با عرض سلام
    می خواستم ازتون سوال کنم که برای تعریف ستون رنگ براساس تعداد سیلندر خودروها، امکان نوشتن دستور شرطی براساس If , Else هم می باشد یا خیر.
    با تشکر از مطالب بسیار آموزنده شما

    پاسخ
  • آبان ۱۱, ۱۳۹۹ در ۷:۵۵ ب٫ظ
    پیوند یکتا

    برا اینکه روی نمودتر هیستوگرام یکی از داده های رو مشخص کنیم باید چه کدی بزنیم

    پاسخ
  • آذر ۱۱, ۱۳۹۹ در ۳:۲۶ ق٫ظ
    پیوند یکتا

    سلام و خسته نباشید آموزش ها مفیده اما R یک نرم افزار نیست یک زبان برنامه نویسی میباشد که از اون توی حوزه های تحلیل داده و غیره استفاده میشود.
    بهتره که اون و زبان برنامه نویسی خطاب کنیم.

    پاسخ
  • آذر ۱۴, ۱۳۹۹ در ۰:۲۱ ق٫ظ
    پیوند یکتا

    سلام ممنونم از توصیحاتتون عالی بود فقط میشه لطف کنین نمودار پراکندگی هم توضیح بدین

    پاسخ
  • آذر ۱۴, ۱۳۹۹ در ۰:۲۲ ق٫ظ
    پیوند یکتا

    دستور نمودار پراکندگی چیه؟ممنون میشم جواب بدین ضروریه کارم

    پاسخ
    • آبان ۱۰, ۱۴۰۰ در ۹:۴۷ ب٫ظ
      پیوند یکتا

      سلام و وقت بخیر

      اولین نمودار رسم شده در مقاله، نمودار پراکندگی است با تابع plot به راحتی می توانید نمودار پراکندگی را رسم کنید.

      پاسخ
  • دی ۲۷, ۱۳۹۹ در ۳:۱۲ ق٫ظ
    پیوند یکتا

    با سلام
    لطفا برای کوچک کردن سایز برچسب گذاری های روی نمودارها چ دستوری لازم است؟

    پاسخ
  • تیر ۹, ۱۴۰۰ در ۵:۱۸ ب٫ظ
    پیوند یکتا

    میشه در نرم افزار R روی باکس پلات مقدار میانگین را مشخص کرد اگه راهی داره لطفا بذارین

    پاسخ
    • آبان ۱۰, ۱۴۰۰ در ۹:۴۸ ب٫ظ
      پیوند یکتا

      با سلام و وقت بخیر

      به مقاله اضافه شد.

      پاسخ
  • آبان ۱۰, ۱۴۰۰ در ۱۰:۱۰ ق٫ظ
    پیوند یکتا

    سلام چطور میشه در R نمودار پلکانی نصب کرد؟
    لطفا راهنمایی کنید ممنون

    پاسخ
    • آبان ۱۰, ۱۴۰۰ در ۹:۴۸ ب٫ظ
      پیوند یکتا

      با سلام و وقت بخیر

      به مقاله اضافه شد.

      پاسخ
  • دی ۱۶, ۱۴۰۰ در ۲:۵۱ ب٫ظ
    پیوند یکتا

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

    پاسخ

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

نشانی ایمیل شما منتشر نخواهد شد.