متغیر فاکتور (Factor) یا متغیر عامل در R — راهنمای کاربردی

۱۱۳۷ بازدید
آخرین به‌روزرسانی: ۰۶ خرداد ۱۴۰۲
زمان مطالعه: ۹ دقیقه
متغیر فاکتور (Factor) یا متغیر عامل در R — راهنمای کاربردی

اغلب با نام متغیر در برنامه‌نویسی یا ریاضیات برخورد کرده‌اید. هنگامی که به مقدار یا داده‌ای دسترسی نداریم ولی می‌خواهیم از آن در بیان فرمول‌ها یا رابطه‌ها استفاده کنیم، از علامت یا نماد x,y,z,x, y ,z , \cdots استفاده می‌کنیم. این نام یا علامت، نماینده همه مقدارهایی است مشخص نیستند ولی ممکن است در آینده (دور یا نزدیک) به کمک اندازه‌گیری یا محاسبات و ... برای آن مقداری مشخص شود. از آنجایی که قبل از چنین اندازه‌گیری یا انجام محاسبات، مقداری برای x,y,z,x, y ,z , \cdots  در دسترس نیست به آن‌ها متغیر می‌گویند. همچنین ممکن است در زمان یا مکان یا موقعیت‌های مختلف دیگر، مقدارهای مختلفی برای متغیر بدست آید. «متغیر فاکتور» یا «متغیر عامل» (Factor)، نوع خاصی از متغیرها هستند که در «تحلیل‌های آماری» (Statistical Data Analysis) و بخصوص «یادگیری ماشین» (Machine Learning) کاربرد مهمی دارند.

997696

با توجه به نوع مقدارهایی که یک متغیر می‌تواند داشته باشد، آن‌ها را به دو گروه «کمی» (Quantity) و «کیفی» (Quality) دسته‌بندی کرده‌اند. متغیرهای کمی اغلب بوسیله اعداد نشان داده می‌شوند در حالیکه بیشتر متغیرهای کیفی به صورت متنی، مقدار دهی می‌شوند. البته ممکن است برای نمایش مقدار متغیر کیفی از اعداد نیز استفاده کرد ولی این اعداد فقط به معنی کد یا شماره در نظر گرفته می‌شوند. به این ترتیب براساس مقدارهای عددی، طبقات یا سطوح متغیرهای کیفی را نمایش می‌دهیم.

در این نوشتار به بررسی متغیرهای کیفی می‌پردازیم که ابزاری برای تفکیک انجام محاسبات در مدل‌های آماری هستند. این متغیرها را عامل یا فاکتور می‌نامیم. برای آشنایی بیشتر با انواع دیگر داده‌ها و متغیرها، بهتر است مطلب جامعه آماری — انواع داده و مقیاس‌های آن‌ها را مطالعه کنید. البته خواندن مطلب توابع Apply در زبان برنامه نویسی R — راهنمای کاربردی نیز خالی از لطف نیست.

متغیر فاکتور یا عامل

برای مباحث آمار و برنامه‌نویسی، «متغیر عامل» یا «فاکتور» (Factor)، دارای مقدارهای عددی محدود است. این اعداد و ارقام معمولا به صورت اعداد صحیح ثبت یا نمایش داده می‌شوند. گاهی به متغیرهای فاکتور یا عامل، «متغیرهای طبقه‌ای» (Categorical) نیز می‌گویند. معمولا مقدارهای عددی به کار رفته برای متغیرهای طبقه‌ای زیرمجموعه‌ای با پایان از اعداد طبیعی هستند. برای مثال می‌توان کشور محل تولد، جنسیت، سمت اداری و ... را از دسته متغیرهای طبقه‌ای در نظر گرفت.

معمولا در «مجموعه داده» (Dataset) متغیرهای کمی و کیفی در کنار یکدیگر حضور دارند. متغیرهای کمی معمولا دارای مقدارهایی از اعداد حقیقی هستند. برای مثال قد و وزن متغیرهایی هستند که مقدارشان به وسیله ابزار اندازه‌گیری بدست آمده و ممکن است در یک بازه از اعداد قرار گیرند. مثلا قد یک فرد ممکن است برابر با 1.96 متر باشد. از آنجایی که مجموعه اعداد حقیقی دارای خاصیت پیوستگی هستند (یعنی بین هر دو عدد حقیقی بی‌نهایت عدد حقیقی دیگر وجود دارد) به متغیرهای کمی از این دست، «متغیرهای پیوسته» (Continuous Variable) نیز می‌گویند.

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

متغیر فاکتور یا عامل در R

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

در بسیاری از الگوریتم‌های «یادگیری ماشین» (Machine Learning)، متغیرهای کیفی با مقدارهای متنی قابل استفاده نیستند. با استفاده از نسبت دادن آن‌ها به عنوان متغیر فاکتور در R، به طور خودکار کدهای عدد برای هر سطح از متغیر کیفی یا طبقه‌ای ایجاد می‌شود. بنابراین از این پس به راحتی در الگوریتم‌های یادگیری ماشین یا مدل‌سازی قابل استفاده‌اند. این کار به کمک تابع factor()factor() صورت می‌پذیرد. شکل دستوری این تابع به صورت زیر است.

1factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
2Arguments:
3- x: A vector of data. Need to be a string or integer, not decimal.
4- Levels: A vector of possible values taken by x. This argument is optional. The default value is the unique list of items of the vector x.
5- Labels: Add a label to the x data. For example, 1 can take the label `male` while 0, the label `female`. 
6- ordered: Determine if the levels should be ordered.

بنابراین با چهار پارامتر در این تابع روبرو هستیم. جدول زیر به معرفی این پارامترها پرداخته است.

پارامترعملکرد
x برداری که شامل مقدارهای متنی یا عددی است و باید به متغیر عامل تبدیل شود.
levels سطوح متغیر x که باید در طبقه بندی نقش داشته باشند. (اختیاری)
labels برچسب برای مقدارهای متغیر عامل (مثلا مقدار کد «۱» برای «مردان» و «۰» برای «زنان»
ordered تعیین مرتب‌سازی سطوح متغیر عامل

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

مثال ۱

براساس کد زیر جنسیت ۵ نفر که در یک متغیر کیفی (متنی) ثبت شده، تبدیل به متغیر عامل می شود.

1# Create gender vector
2gender_vector <- c("Male", "Female", "Female", "Male", "Notrecognize")
3class(gender_vector)
4# Convert gender_vector to a factor
5factor_gender_vector <- factor(gender_vector)
6factor_gender_vector1 <-factor(gender_vector,levels = c("Male","Female"))
7factor_gender_vector
8factor_gender_vector1
9class(factor_gender_vector)
10class(factor_gender_vector1)

مشخص است که بوسیله تابع factor در متغیر factor_gender_vector متغیر متنی به متغیر عامل یا فاکتور تبدیل شده است که در خروجی سطوح متغیر عامل را به صورت Female, Male, Notrecognize خواهیم دید. همچنین در متغیر factor_gender-vector1 نیز فقط دو مقدار Male و Female به عنوان سطوح متغیر عامل در نظر گرفته شده‌اند.

1> factor_gender_vector
2[1] Male         Female       Female       Male         Notrecognize
3Levels: Female Male Notrecognize
4> factor_gender_vector1
5[1] Male   Female Female Male   <NA>  
6Levels: Male Female
7> class(factor_gender_vector)
8[1] "factor"
9> class(factor_gender_vector1)
10[1] "factor"

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

ایجاد متغیر فاکتور براساس مقدارهای اسمی و ترتیبی

همانطور که در مطلب جامعه آماری — انواع داده و مقیاس‌های آن‌ها خواندید، متغیرهای کیفی به دو گروه متغیرهای کیفی با «مقیاس اسمی» (Nominal) و متغیرهای کیفی با «مقیاس ترتیبی» (Ordinal) دسته‌بندی می‌شوند.\

زمانی که از مقیاس اسمی استفاده کنیم، هیچ ترتیبی برای مقدارهای متغیر عامل در R ایجاد نمی‌شود.

مثال ۲

در کد زیر، برای متغیر «عامل رنگ» یا factor_color ترتیبی برای قرارگیری رنگ‌ها در نظر گرفته نشده است.

1# Create a color vector
2color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow')
3# Convert the vector to factor
4factor_color <- factor(color_vector)
5factor_color

به این ترتیب خروجی به صورت زیر خواهد بود.

1> factor_color
2[1] blue   red    green  white  black  yellow
3Levels: black blue green red white yellow

در مقابل مقدارها یا داده‌های کیفی اسمی، مقدارهای کیفی از نوع ترتیبی قرار دارند که ذاتا دارای ترتیب هستند. این ترتیب ممکن است به صورت «صعودی» (Ascending) یا «نزولی» (Descending) باشد. منظور از ترتیب صعودی برای اعداد، قرارگیری از کمترین مقدار در اولین مکان و بزرگترین مقدار در انتها است. همچنین در ترتیب نزولی، قرارگیری بیشترین مقدار در ابتدا و کوچکترین مقدار در انتهای لیست مورد نظر است. برای مرتب سازی صعودی یا نزولی داده‌ها یا مقدارهی متنی، ملاک ترتیب حروف الفبا هر عبارت است که از حروف ابتدایی کلمه آغاز می‌شود.

type of variables

مثال ۳

فرض کنید رخداد زلزله در اوقات مختلف روز در یک متغیر ثبت شده‌اند. برای تبدیل آن‌ها به متغیر عامل از دستورات زیر استفاده کرده‌ایم.

1# Create Ordinal categorical vector 
2day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening')
3# Convert `day_vector` to a factor with ordered level
4factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight'))
5# Print the new variable
6factor_day

با اجرای این کد متغیر day_vector تبدیل به یک متغیر عامل شده و سطوح مرتب شده نیز در قسمت Levels دیده می‌شوند.

1[1] evening   morning   afternoon midday    midnight  evening  
2Levels: morning < midday < afternoon < evening < midnight

حال می‌توانیم جمع تعداد زلزله‌ها را در مقاطع مختلف روز به کمک تابع summary()summary() دریافت کنیم.

1## Levels: morning < midday < afternoon < evening < midnight
2# Append the line to above code
3# Count the number of earthquake of each level
4summary(factor_day)

خروجی به صورت زیر خواهد بود. مشخص است که R، تعداد زلزله‌ها را به ترتیب معرفی شده در قسمت Levels محاسبه کرده است.

1> summary(factor_day)
2  morning    midday afternoon   evening  midnight 
3        1         1         1         2         1

ایجاد متغیر فاکتور براساس مقدارهای متغیر پیوسته

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

هر دو این اعمال در R به کمک تابع cut()cut() صورت می‌گیرد.

1cut(x, breaks, labels = NULL,
2    include.lowest = FALSE, right = TRUE, dig.lab = 3,
3    ordered_result = FALSE,)

جدول زیر به معرفی پارامترهای این تابع پرداخته است.

پارامترعملکرد
x برداری که باید مقدارهای آن طبقه‌بندی و برش داده شوند.
breaks معرفی تعداد طبقات یا تعریف نقاط برش براساس یک بردار از نقاط
labels برچسب سطوح برای متغیر طبقه‌ای
include.lowest مقداری منطقی برای منظور کردن کران پایین به طبقه
right مقداری منطقی برای منظور کردن کران بالا به طبقه
dig.lab قالب برای تعداد ارقام عدد برش
ordered_result مقدار منطقی به منظور تعیین ترتیب برای متغیر عامل

مثال 4

فرض کنید که می‌خواهید اعداد ۱ تا ۱۰ را به چهار طبقه تقسیم کنید. برای انجام این کار دو روش پیشنهاد می‌کنیم. یا تعیین تعداد طبقات یا استفاده از معرفی برداری که نقاط برش را نشان می‌دهد. کد زیر بر اساس اولین راه‌کار یعنی تعیین تعداد طبقات، نوشته شده است.

11:10
2cut10=cut(1:10, 4)
3cut10
4class(cut10)

در تابع cut، پارامتر اول اعداد ۱ تا ۱۰ را مشخص و پارامتر دوم نیز تعداد طبقات را تعیین می‌کند. در انتها نیز با استفاده از تابع class نوع متغیر cut10 که مقدارهای برش داده‌ شده در آن قرار گرفته‌اند نمایش داده می‌شود. خروجی به صورت زیر است.

1> 1:10
2 [1]  1  2  3  4  5  6  7  8  9 10
3> cut10=cut(1:10, 4)
4> cut10
5 [1] (0.991,3.25] (0.991,3.25] (0.991,3.25] (3.25,5.5]   (3.25,5.5]  
6 [6] (5.5,7.75]   (5.5,7.75]   (7.75,10]    (7.75,10]    (7.75,10]   
7Levels: (0.991,3.25] (3.25,5.5] (5.5,7.75] (7.75,10]
8> class(cut10)
9[1] "factor"

می‌توان دید که در خروجی دستور cut10، مشخص است که هر یک از مقدارها ۱ تا ۱۰ در کدام دسته قرار دارند. همچنین در قسمت levels نیز طبقه‌های ایجاد شده، دیده می‌شوند. در انتها نیز نوع متغیر cut10، متغیر عامل یا فاکتور گزارش شده است.

continuous variable cut

حال با استفاده از راهکار دوم، یعنی تعیین برداری از نقاط برش این کار را انجام می‌دهیم. به این ترتیب اعداد ۱ تا ۱۰ را با استفاده از نقاط برش ۰، ۲، ۵، ۷، ۹، ۱۰ طبقه‌بندی می‌کنیم. پارامتر اول که مشخص کننده بردار مقدارهایی است که باید تبدیل به طبقات شوند. همچنین در این حالت پارامتر دوم را به صورتی در می‌آوریم که هر مقدار نشان‌دهنده یک محل برش باشد.

11:10
2cut10=cut(1:10, breaks = c(0,2,5,7,9,10))
3cut10
4class(cut10)

مشخص است که بردار نقاط برش دارای ۵ عنصر است ولی طبقه‌های ایجاد شده برابر با ۶ خواهند بود. همیشه تعداد طبقات یکی بیشتر از تعداد نقاط برش است. خروجی به صورت زیر دیده خواهد شد.

1> 1:10
2 [1]  1  2  3  4  5  6  7  8  9 10
3> cut10=cut(1:10, breaks = c(0,2,5,7,9,10))
4> cut10
5 [1] (0,2]  (0,2]  (2,5]  (2,5]  (2,5]  (5,7]  (5,7]  (7,9]  (7,9] 
6[10] (9,10]
7Levels: (0,2] (2,5] (5,7] (7,9] (9,10]
8> class(cut10)
9[1] "factor"
10>

مقدارهایی که در متغیر cut10 قرار گرفته است، نشان دهنده تعلق هر مقدار در گروه متغیر عامل یا فاکتور است.

نکته: برای اطلاع از نحوه قرارگیری نقاط مرزی درون هر طبقه به علامت‌های «(» و «[» توجه کنید. هر گاه از علامت «)» در کنار عدد استفاده شود، به این معنی است که نقطه مرزی به طبقه تعلق ندارد و هنگام استفاده از «[» در کنار عدد مشخص می‌شود که مقدار مرزی، متعلق به آن طبقه است.

مثال ۵

فرض کنید قرار است برای ۱۰0۰۰ اعداد تصادفی از توزیع نرمال، عمل طبقه‌بندی و شمارش فراوانی اعداد در هر طبقه را انجام دهیم. کد زیر را به این منظور تهیه شده است.

1Z <-rnorm(10000)
2#Frequency Table
3table(cut(Z, breaks = -6:6))
4# Counting
5sum(table(cut(Z, breaks = -6:6, labels = FALSE)))
6
7#Frequency Table
8table(cut(Z, breaks = -3:3))
9# Counting
10sum(table(cut(Z, breaks = -3:3, labels = FALSE)))

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

1> Z <-rnorm(10000)
2> #Frequency Table
3> table(cut(Z, breaks = -6:6))
4
5(-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1]  (-1,0]   (0,1]   (1,2] 
6      0       0      16     233    1390    3391    3356    1382 
7  (2,3]   (3,4]   (4,5]   (5,6] 
8    220      11       1       0 
9> # Counting
10> sum(table(cut(Z, breaks = -6:6, labels = FALSE)))
11[1] 10000
12> 
13> #Frequency Table
14> table(cut(Z, breaks = -3:3))
15
16(-3,-2] (-2,-1]  (-1,0]   (0,1]   (1,2]   (2,3] 
17    233    1390    3391    3356    1382     220 
18> # Counting
19> sum(table(cut(Z, breaks = -3:3, labels = FALSE)))
20[1] 9972
21>

در حدود اولیه که در فاصله ۶- تا ۶ بود، همه ۱۰۰0۰ مقدار عددی قرار گرفته بودند در حالیکه در محدود ۳- تا ۳ فقط ۹۹۷۲ مشاهده قرار دارد. یعنی چیزی حدود 8 عدد یا 0.08 درصد از اعداد تصادفی توزیع نرمال، در فاصله بزرگتر از ۳ یا کوچکتر از ۳- هستند که البته بسیار ناچیز است.

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

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

^^

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
نظر شما چیست؟

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