آمار , داده کاوی 13 بازدید

یکی از روش‌های خلاصه کردن داده‌ها، جمعی‌بندی (Aggregation) است. با استفاده از این روش برای یک گروه از داده‌ها، یک نماینده انتخاب می‌شود. به این ترتیب می‌توان توزیع احتمالی یا فراوانی یک متغیر کمی را به تفکیک سطوح مختلف یک متغیر کیفی یا طبقه‌ای (Categorical Variable) بدست آورد. در این نوشتار به بررسی دو تابع معروف در زبان برنامه‌نویسی آماری R به نام‌های $$summarise()$$ و $$group\_by()$$ خواهیم پرداخت. در این میان از کتابخانه‌ dplyr استفاده خواهیم کرد. بنابراین شاید مطالعه مطلب تبدیل و پاکسازی داده‌ ها با کتابخانه dplyr و tidyr در R — راهنمای کاربردی خالی از لطف نباشد. اکنون و در ادامه به توابع جمع بندی پیش‌تر اشاره شده خواهیم پرداخت.

توابع جمع‌ بندی (Aggregation Functions)

به عنوان یک «تحلیل‌گر داده» (Data Scientist) باید توانایی تغییر ساختار و شاخص‌سازی برای یک «مجموعه داده» (Dataset) را داشته باشید. بخصوص اگر از زبان‌برنامه نویسی R استفاده می‌کنید، این کار به صورت معمول در همه تحلیل‌ها، ضرورت خواهد داشت. برای آشنایی با این گونه توابع از یک بانک اطلاعاتی به نام batting_lahman.csv که در (+) قرار دارد، استفاده خواهیم کرد. این مجموعه داده شامل 20563 مشاهده و 22 متغیر است. البته بعضی از این متغیرها را در اینجا به کار خواهیم گرفت. متغیرهایی که در این نوشتار به آن‌ها می‌پردازیم در زیر فهرست شده‌اند.

نام متغیر شرح
playerID شماره بازیکن (از نوع عامل)
teamID کد تیم (از نوع عامل)
lgID کد مسابقات (از نوع عامل با سطوح AA, AL, FL, NL, PL, UA)
AB تعداد قرارگیری در پست At bats (عددی)
G تعداد بازی‌های هر بازیکن (عددی)
R تعداد Runها (عددی)
HR تعداد بازی‌های خانگی (عددی)
SH تعداد ضربه‌های sacrifice

برای شروع کار گام‌های زیر را باید برداریم تا به مجموعه داده دلخواه با متغیرهایی که در بالا ذکر شده دست پیدا کنیم.

  • گام اول: داده‌ها را وارد کنیم.
  • گام دوم: متغیرهای مورد نظر را انتخاب کنیم.
  • گام سوم: داده‌ها را مرتب کنیم.

این گام‌ها در کد زیر پیاده‌سازی شده‌اند. همانطور که می‌بینید، کتابخانه dplyr در اینجا نقش مهمی دارد.

برای مشاهده بخشی از داده‌ها بهتر است از دستور (glimpse(data استفاده کنیم. نتیجه به صورت زیر خواهد بود.

تابع Summarise

شکل تابع $$summarise()$$ به مانند دیگر توابع کتابخانه dplyr است. با این تابع می‌توان یک متغیر محاسباتی براساس تابعی که معرفی می‌کنید ایجاد کرد.

پارامتر اول نام «چارچوب داده» (Data Frame) و پارامتر دوم نام متغیر و نحوه محاسبه این متغیر جدید است. برای مثال اگر قرار باشد که میانگین متغیر R را در چارچوب داده data محاسبه کرده و در متغیر mean_run قرار دهیم، باید شکل دستوری summarise به صورت زیر نوشته شود.

نتیجه ایجاد متغیر mean_run با مقدار 19.20144 خواهد بود. همین کار را برای متغیرهای دیگر نیز می‌توان در یک دستور انجام داد. برای مثال، کد زیر میانگین را برای متغیرهای G و SH محاسبه می‌کند. البته برای متغیر SH‌ پارامتر na.rm=TRUE نشان می‌دهد که باید مقادیر ناموجود (گمشده) که با NA در مجموعه داده data ثبت شده‌اند حذف و سپس محاسبه میانگین صورت گیرد.

گروه بندی با group_by

اگر هدف از اجرای تابع $$summarise()$$ جمع‌بندی براساس گروه‌ها باشد باید از group_by نیز استفاده کرد. به این ترتیب آماره‌های توصیفی به تفکیک متغیر گروه‌بندی ایجاد می‌شود. ترکیب این تابع با توابع دیگر مانند mutate و filter و arrange بسیار کاربردی و موثر است.

در اینجا استفاده از «عملگر سلسله‌ای» (Pipeline Operator) بخصوص زمانی که مراحل زیاد باشند، مناسب به نظر می‌رسد. در ادامه با استفاده از این عملگر و تابع group_by و summarise محاسبات را انجام داده‌ایم.

همانطور که دیده می‌شود، مجموعه داده data وارد فیلتر group_by شده و محاسبات مربوط به میانگین متغیر HR به تفکیک متغیر lgID ثبت خواهد شد. در نتیجه خروجی شامل ۷ سطر است که میانگین متغیر HR را در سطوح مختلف متغیر lgID مشخص می‌کند.

از عملگر سلسله‌ای در تابع ggplot از کتابخانه ggplot2 نیز می‌توان استفاده کرد. به این ترتیب می‌توان محاسباتی که توسط summarise صورت گرفته را در نمودار به کار برد. فرض کنید می‌خواهیم میانگین متغیر HR را به تفکیک سطوح متغیر lgID روی یک نمودار میله‌ای (Bar Chart) نمایش دهیم. مراحل زیر برای انجام چنین کاری باید طی شود.

  • انتخاب چارچوب داده (Data Frame)
  • دسته‌بندی کردن داده‌ها (Group Data)
  • محاسبه شاخص جمع‌بندی (Summarize the Data)
  • رسم نمودار شاخص محاسبه شده (Plot the Summary Statistics)

این گام‌ها در کد زیر انجام شده است. توجه داشته باشید که از کتابخانه ggplot2 استفاده کرده‌ایم.

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

Aggregate and plotting

توابع محاسباتی در Summarise

تقریبا همه توابع محاسباتی در summarise قابلیت استفاده دارند. در ادامه به لیست کوتاهی از توابع معمول که در summarise به کار می‌روند اشاره می‌کنیم. توجه دارید که این لیست شامل توابعی است که خروجیشان به صورت یک عدد ظاهر خواهد شد.

نوع تابع شیوه محاسبه تابع
پایه‌ میانگین mean()
میانه median()
جمع sum()
پراکندگی انحراف استاندارد sd()
دامنه میان چارکی IQR()
دامنه حداقل min()
حداکثر max()
چندک quantile()
موقعیت مقدار اولین موقعیت (اولین مقدار) first()
مقدار آخرین موقعیت (آخرین مقدار) last()
مقدار nامین موقعیت nth()
شمارش شمارش تعداد سطرها n()
شمارش تعداد مشاهدات مجزا n_distinct()

در ادامه برای هر یک از این حالت‌ها مثال‌هایی خواهیم دید.

توابع پایه

در کدهایی که تا به حال در این نوشتار دیدید، نتایج محاسبه شاخص‌های جمع‌بندی و summarise در متغیری ثبت نشد. حال نتیجه محاسبات با summarise را درون یک «چارچوب داده» (data frame) ثبت و از آن استفاده خواهیم کرد.

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

در گام اول، شاخص میانگین استخراج می‌شود. این کار توسط کد زیر صورت گرفته است:

نتیجه اجرای این کار به صورت زیر است. مشخص است که نتیجه محاسبه شاخص میانگین توسط summarise روی گروه‌های تعیین شده توسط group_by برای هر سال استخراج شده و به صورت یک چارچوب داده در ex1 ثبت شده است.

در گام دوم برای رسم نمودار از متغیر ایجاد شده کمک گرفته و نمودار خطی ترسیم می‌شود.

نمودار خطی مطابق با تصویر زیر ظاهر خواهد شد.

Aggregate and line plotting

درون summarise می‌توان بیش از یک متغیر را محاسبه کرد. در کد زیر علاوه بر محاسبه میانه برای متغیر AB میانه برای داده‌هایی از متغیر AB که غیر صفر هستند نیز محاسبه شده و با میانه قبلی مقایسه شده است. همانطور که دیده می‌شود از نوعی فیلتر به صورت $$[AB>0]$$ برای متغیر AB استفاده کرده‌ایم.

به این ترتیب خروجی به صورتی است که «میانه» (Median) در هر دو حالت (با احتساب مقدارهای صفر و بدون آن) محاسبه و به تفکیک lgID ظاهر شده است.

در مثال بعدی با استفاده از تابع sum مجموع بازی‌های خانگی هر تیم (HR) به تفکیک کد لیگ مسابقات (lgID) محاسبه شده است.

نکته: همانطور که در خروجی می‌بینید متغیر lgID از نوع فاکتور یا عامل (<fctr>)و متغیر جمع‌بندی sum_homerun_leage عددی (<int>) است.

معیارهای پراکندگی

معمولا برای محاسبه میزان پارکندگی داده‌ها در R از شاخص‌های انحراف استاندارد که توسط تابع sd قابل دسترسی است، کمک می‌گیرند. کد زیر به منظور محاسبه میزان پراکندگی برای HR تهیه شده است.

نتیجه در ادامه قابل مشاهده است.

نکته: اگر می‌خواهید خروجی به صورت مرتب شده برحسب متغیر جمع‌بندی ظاهر شود باید از دستور arrange استفاده کنید. بنابراین برای نمایش انحراف استاندارد بازی‌های خانگی به ترتیب از بزرگ به کوچک دستورات را به صورتی که در ادامه آمده‌ است، وارد و اجرا کنید.

خروجی این قطعه کد در ادامه، دیده می‌شود.

مشخص است که تیم ML1 دارای بیشترین انحراف استاندارد برای بازی‌های خانگی است.

معیارهای مرتبط با دامنه

همچنین می‌توان حداکثر و حداقل تعداد بازی‌های هر بازیکن را به همین شکل بدست آورد. به کد زیر توجه کنید.

نکته: حتما تا به حال متوجه شده‌اید که با اجرای عملگر سلسله مراتب، احتیاجی به ذکر مجموعه داده data در summarise نیست.

پس از انجام محاسبات، خروجی به صورتی که در ادامه قابل مشاهده است، ظاهر خواهد شد.

موقعیت

برای نمایش مقدارها در موقعیت‌های خاص از توابعی مانند first و last‌ استفاده می‌کنیم. فرض کنید که باید برای هر بازیکن، سال شروع به فعالیت ورزشی و سال بازنشستگی را مشخص کنید. این توابع را در summarise به این منظور به کار برده و کدی که در ادامه قابل مشاهده است را ایجاد کرده‌ایم.

خروجی حاصل از اجرای این کد در ادامه قابل مشاهده است.

همینطور برای دسترسی به nامین مشاهده کافی است از تابع ()nth استفاده شود. فرض کنید در مجموعه داده data بخواهیم فقط روی بازی‌هایی که تیم در سال دوم فعالیتش انجام داده تمرکز داشته باشیم. با استفاده از کدی که در ادامه مشاهده می‌کنید این منظور محقق شده است.

ابتدا بوسیله group_by دسته‌بندی براساس کد تیم صورت گرفته، سپس خروجی براساس دومین «سال بازی» (yearID) هر تیم به صورت نزولی ظاهر خواهد شد. به خروجی توجه کنید.

به این ترتیب، متوجه می‌شویم سال 1۸۷1 دومین سالی بوده که تیم BS1 در لیگ شرکت کرده بوده است.

شمارش (Count)

برای شمارش تعداد مشاهدات براساس تفکیکی که group_by ایجاد کرده است، از تابع $$n()$$‌ در summarise استفاده می‌کنیم. به کد زیر توجه کنید.

مشخص است که برای مرتب‌سازی خروجی از arrange و شیوه مرتب‌سازی نزولی (Descending) استفاده شده است. خروجی که شامل تعداد بازی‌های بازیکنان به صورت نزولی است را در ادامه می‌توانید ببینید.

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

خروجی به صورت زیر در خواهد آمد. همانطور که مشخص است number_player تعداد بازیکنان برای هر تیم را ثبت و نمایش داده است.

گروه‌بندی ترکیبی (Multiple Groups)

همانطور که گفته شد، تابع group_by امکان دسته‌بندی مشاهدات را براساس یک متغیر عامل انجام می‌دهد. این طبقه‌بندی می‌تواند به صورت ترکیبی نیز باشد. برای مثال می‌توان بازی‌ها را براساس هم سال و هم تیم، طبقه‌بندی کرده و میانگین بازی‌های صورت گرفته را محاسبه کرد. در خروجی از ترتیب نزولی کد تیم (teamID) و کد سال (yearID) بهره گرفته‌ایم تا میانگین بازی‌های هر تیم در سال‌های مختلف را نمایش دهیم. به کد زیر توجه کنید:

خروجی در ادامه قابل مشاهده است. همانطور که می‌بینید، ترتیب نمایش متوسط بازی‌ها براساس اولویت نام تیم است. اگر نام تیمی تکراری باشد، متوسط بازی‌ها به ترتیب سال انجام بازی از کم به زیاد مرتب شده است.

ایجاد فیلتر (Filter)

گاهی لازم است که محاسبات براساس مشاهدات خاصی صورت گیرد. به کمک تابع ()filter این امکان در R بوجود آمده است. فرض کنید می‌خواهید محاسبات میانگین بازی‌ها را به سال‌های بعد از 1۹۸۰ محدود کنید. کد زیر به این منظور نوشته شده است.

مشخص است که در تابع ()filter از پارامتر 1980<yearID برای ایجاد محدودیت روی مشاهدات برحسب سال‌های بعد از 1980 استفاده شده، سپس طبقه‌بندی و محاسبه میانگین بازی‌ها به تفکیک سال، انجام شده است. نتیجه اجرای کد به صورت زیر خواهد بود.

خارج کردن از گروه‌بندی (Ungroup)

اگر در حین محاسبات روی گروه‌ها، لازم باشد که شاخصی برای همه مشاهدات بدست آید، می‌توانید از تابع ()ungroup استفاده کنید. فرض کنید قرار است درصد بازی‌ها خانگی (HR) به کل بازی‌ها (G)، به تفکیک هر بازیکن محاسبه شود. براساس این مقدارها، میانگین درصد کل بازی‌های خانگی بازیکنان (بدون در نظر گرفتن گروه‌بندی براساس بازیکنان) نیز باید در انتها بدست آید.

همانطور که در کد زیر قابل مشاهده است، تابع ()ungroup به عنوان یک تابع درون عملگرهای سلسله‌ مراتبی ظاهر شده و باعث می‌شود که گروه‌بندی برداشته شود. بنابراین محاسبه summarise برای همه مشاهدات اعمال خواهد شد.

همانطور که دیده می‌شود، فیلتر $$filter(HR>0)$$ باعث می‌شود، مشاهداتی که تعداد بازی‌های خانگی‌ آن‌ها صفر است، از محاسبات خارج شوند. خروجی به صورت زیر در خواهد آمد.

به این ترتیب مشخص است که فقط بطور متوسط ۶ درصد بازی‌های بازیکنان در خانه صورت گرفته است.

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

خلاصه

جدول زیر به بررسی اجمالی محاسبات توسط summarise پرداخته است.

روش  تابع کد
محاسبه میانگین روی مجموعه داده df روی متغیر x1 mean summarise(df,mean_x1=mean(x1))
محاسبه میانه روی مجموعه داده df روی متغیر x1 median summarise(df,median_x1=median(x1))
محاسبه مجموع روی مجموعه داده df روی متغیر x1 sum summarise(df,sum_x1=sum(x1))
محاسبه انحراف استاندارد روی مجموعه داده df روی متغیر x1 sd summarise(df,sd_x1=sd(x1))
محاسبه دامنه چارکی روی مجموعه داده df روی متغیر x1 IQR summarise(df,interquartile_x1=IQR(x1))
محاسبه حداقل روی مجموعه داده df روی متغیر x1 min summarise(df,minimum_x1=min(x1))
محاسبه حداکثر روی مجموعه داده df روی متغیر x1 max summarise(df,maximum_x1=max(x1))
محاسبه چندک‌ها روی مجموعه داده df روی متغیر x1 quantile summarise(df,quantile_x1=quantile(x1))
محاسبه اولین مقدار روی مجموعه داده df روی متغیر x1 first summarise(df,first_x1=first(x1))
محاسبه آخرین مقدار روی مجموعه داده df روی متغیر x1 last summarise(df,last_x1=last(x1))
محاسبه nامین مقدار روی مجموعه داده df روی متغیر x1 nth summarise(df,nth_x1=nth(x1, 2))
محاسبه تعداد مقدار روی مجموعه داده df روی متغیر x1 n summarise(df,n_x1=n(x1))
محاسبه تعداد تکرار‌های یک مقدار روی مجموعه داده df روی متغیر x1 n_distinct summarise(df,n_distinct _x1=n_distinct(x1))

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

^^

بر اساس رای 1 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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