آموزش تحلیل افراد با استفاده از R – Employee Churn

این آخرین مقاله از سری سه مقاله در مورد ریزش کارکنان است که در AIHR Analytics منتشر شده است. در این مقاله نحوه ساخت، ارزیابی و استقرار مدل گردش مالی پیش‌بینی خود را با استفاده از R نشان خواهم داد.

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

ممکن است بپرسید که کارمند چرند چیست؟ در یک کلام، گردش مالی زمانی است که کارکنان سازمان را ترک می کنند. به عبارت دیگر خاتمه می یابد، خواه ارادی باشد یا غیر ارادی. در گسترده ترین مفهوم، ریزش یا گردش مالی به محاسبه نرخ خروج افراد از سازمان مربوط می شود و فرد خود را خاتمه می دهد.

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

این نرخ‌های گردش مالی تنها تأثیر ریزش یا گردش مالی را در «مجموع» نشان می‌دهند. علاوه بر این، ممکن است علاقه مند باشید که دقیقاً «چه کسی» یا «کدام کارمندان» دقیقاً در معرض خطر ترک سازمان باشند. به همین دلیل است که ما علاوه بر مجموع، به فرد نیز علاقه مندیم.

از نظر آماری، “Churn” بدون در نظر گرفتن زمینه، “Churn” است. زمانی است که یکی از اعضای یک جمعیت جمعیتی را ترک می کند. یکی از نمونه‌هایی که در Microsoft AzureML و در بسیاری از کتاب‌های درسی علم داده مشاهده خواهید کرد، انحراف «مشتری» است. این از زمینه بازاریابی است.

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

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

این تجزیه و تحلیل نمونه ای از این است که چگونه منابع انسانی باید خارج از چارچوب سنتی خود فکر کند. این تجزیه و تحلیل کمک می کند تا به چالش ها و مسائل آینده HR رسیدگی شود.

در سطح شخصی، من دوست دارم People Analytics را زمانی تصور کنم که فرآیند علم داده برای اطلاعات منابع انسانی اعمال می شود. به همین دلیل، من می‌خواهم دوباره بررسی کنم که آن فرآیند چیست و از آن به عنوان چارچوبی برای راهنمایی بقیه مثال‌های نشان‌داده‌شده در این مقاله استفاده کنم.

فرآیند علم داده مورد بازبینی قرار گرفت

فرآیند علم داده شامل شش مرحله است.

  1. هدف را تعریف کنید. همانطور که در بالا ذکر شد، این به معنای شناسایی مدیریت منابع انسانی است
    مشکل تجاری که در تلاش برای حل آن هستید. بدون مشکل یا مشکل برای حل، ما یک مشکل نداریم
    هدف
  2. جمع آوری و مدیریت داده ها در ساده ترین حالت، شما می خواهید یک «مجموعه داده» از اطلاعات مرتبط با مشکل درک شود. جمع‌آوری و مدیریت داده‌ها می‌تواند یک عصاره ساده از سیستم اطلاعات منابع انسانی شرکت، یا خروجی از یک انبار داده پیچیده یا ابزار هوش تجاری مورد استفاده در اطلاعات منابع انسانی باشد. برای هدف این مقاله، ما از یک فایل ساده با ارزش جداگانه کاراکتر (CSV) استفاده خواهیم کرد. همچنین شامل کاوش داده ها برای مسائل مربوط به کیفیت داده و برای نگاه اولیه به آنچه داده ها ممکن است به شما بگویند می شود.
  3. ساخت مدل. پس از اینکه مشکل یا هدفی را که می خواهید به آن برسید، تعریف کردید، روش یا ابزار داده کاوی را انتخاب می کنید که برای رسیدگی به آن نوع مشکل طراحی شده است. با Employee Churn سعی می‌کنید پیش‌بینی کنید که چه کسی ممکن است در مقایسه با کسانی که می‌مانند، ترک کنند. مشکل کسب و کار ابزارهای داده کاوی مناسب را برای در نظر گرفتن تعیین می کند. روش‌های رایج داده‌کاوی مورد استفاده در مدل‌سازی عبارتند از: طبقه‌بندی، رگرسیون، تشخیص ناهنجاری، سری‌های زمانی، خوشه‌بندی و تحلیل‌های ارتباطی. این رویکردها اطلاعات/داده ها را به عنوان ورودی می گیرند، آنها را از طریق الگوریتم های آماری اجرا می کنند و خروجی تولید می کنند.
  4. مدل ارزیابی و نقد. هر رویکرد داده‌کاوی می‌تواند الگوریتم‌های آماری مختلفی داشته باشد تا روی داده‌ها اعمال شود. ارزیابی هم همان چیزی است که الگوریتم‌ها دقیق‌ترین پیش‌بینی‌ها را در مورد داده‌های جدید ارائه می‌کنند، و آیا ما همه داده‌های مرتبط را در اختیار داریم – یا اینکه برای افزایش دقت پیش‌بینی مدل به انواع بیشتری از داده‌ها نیاز داریم؟ این فرآیند می تواند یک فعالیت تکراری و دایره ای در طول زمان برای بهبود مدل باشد
  5. ارائه نتایج و سند هنگامی که مدل خود را به سطح قابل قبول و قابل پیش بینی مفید رساندیم، فعالیت خود را مستند کرده و نتایج را ارائه می کنیم. تعریف قابل قبول و مفید واقعاً به سازمان مربوط است، اما در همه موارد به این معنی است که نتایج نسبت به آنچه در غیر این صورت می‌بود، بهبود یافته است. اصل پشت “علم داده” مانند هر علم دیگری این است که با همان داده ها و روش، مردم باید بتوانند یافته های ما را بازتولید کنند.
  6. استقرار مدل. کل هدف از ساخت مدل (که بر روی داده های موجود است) این است:
    • از مدل در داده های آینده استفاده کنید تا زمانی که برای پیش بینی یا جلوگیری از وقوع چیزی قبل از وقوع یا در دسترس قرار گیرد
    • برای درک بهتر مشکل موجود در کسب و کار ما برای ایجاد پاسخ های خاص تر

مرحله 1. هدف را تعریف کنید

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

سؤالات زیر از جمله سؤالاتی است که می خواهند به آنها پاسخ داده شود:

  1. چه نسبتی از کارکنان ما می روند؟
  2. کجا رخ می دهد؟
  3. سن و مدت خدمت چه تاثیری بر فسخ دارد؟
  4. چه چیز دیگری به آن کمک می کند؟
  5. آیا می توانیم فسخ آینده را پیش بینی کنیم؟
  6. اگر چنین است، چقدر می توانیم پیش بینی کنیم؟

مرحله 2 – جمع آوری و مدیریت داده ها

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

آنها پس از مشورت با کارکنان HRIS خود دریافتند که به اطلاعات زیر دسترسی دارند:

  • شناسه کارمند
  • تاریخ ضبط
  • تاریخ تولد
  • تاریخ استخدام اصلی
  • تاریخ خاتمه (در صورت فسخ)
  • سن
  • طول خدمت
  • شهر
  • بخش
  • عنوان شغلی
  • نام فروشگاه
  • جنسیت
  • دلیل فسخ
  • نوع خاتمه (اختیاری یا غیر ارادی)
  • وضعیت سال – سال داده ها
  • وضعیت – فعال یا خاتمه یافته در طول سال وضعیت
  • واحد تجاری – فروشگاه یا دفتر مرکزی

این شرکت متوجه شد که آنها 10 سال داده های خوبی دارند – از 2006 تا 2015. می خواهد از 2006-2014 به عنوان داده های آموزشی استفاده کند و از سال 2015 به عنوان داده برای آزمایش استفاده کند. داده ها شامل

  • تصویری از تمام کارکنان فعال در پایان هر یک از آن سال ها همراه با
  • فسخ هایی که در طی هر یک از آن سال ها اتفاق افتاد.

بنابراین، هر سال رکوردهایی خواهد داشت که یا وضعیت “فعال” یا “فسخ شده” دارند. از میان اقلام اطلاعاتی ذکر شده در بالا، “STATUS” متغیر “وابسته” است. این مقوله ای است که باید پیش بینی کرد. بقیه متغیرهای مستقل هستند. آنها پیش بینی کننده های بالقوه هستند.

ابتدا به داده ها – ساختار نگاه کنید

بیایید داده ها را بارگذاری کنیم. (به هر حال، داده های زیر کاملاً ساختگی هستند)
شما می توانید مجموعه داده های این شرکت را در اینجا بیابید. از این مجموعه داده ها برای آموزش استفاده کنید.

# یک قاب داده R را بارگیری کنید.
MFG10YearTerminationData <- read.csv("~/Visual Studio 2015/Projects/EmployeeChurn/EmployeeChurn/MFG10YearTerminationData.csv") MYdataset <- MFG10YearTerminationData
خ(MYdataset) ## 'data.frame': 49653 obs. از 18 متغیر: ## $ EmployeeID : int 1318 1318 1318 1318 1318 1318 1318 1318 1318 ... ## $ recorddate_key : Factor w/ 130 level "1/1/4" .2:40. 44 45 46 47 48 49 50 ... ## $ birthday_key : Factor w/ 5342 level "1941-01-15","1941-02-14"،..: 1075 1075 1075 1075 1075 10751075107510751075 .. ## $ orighiredate_key : Factor w/ 4415 level "1989-08-28","1989-08-31"،..: 1 1 1 1 1 1 1 1 1 1 ... ## $ Terminationdate_key: Factor w/ 1055 سطح "1900-01-01"،"2006-01-01"،..: 1 1 1 1 1 1 1 1 1 1 1 ... ## $ سن : int 52 53 54 55 56 57 58 59 60 61 ... ## $ طول_خدمت : int 17 18 19 20 21 22 23 24 25 26 ... ## $ city_name : Factor w/ 40 level "Abbotsford", "Aldergrove",...: 35 35 355 35 . 35 35 35 35 35 ... ## $ بخش_نام : فاکتور w/ 21 سطح "حسابداری"،"حساب های پرداختنی"،...: 10 10 10 10 10 10 10 10 10 10 ... ## $ عنوان_کار : فاکتور w / 47 سطح "کارمند حسابداری"،..: 9 9 9 9 9 9 9 9 9 9 ... ## $ store_name : int 35 35 35 35 35 35 35 35 35 35 35 ... ## $ جنسیت_کوتاه : فاکتور w / 2 سطح "F"،"M": 2 2 2 2 2 2 2 2 2 2 ... ## $ gender_full : Factor w/ 2 level "Female", "Male": 2 2 2 2 2 2 2 2 2 2 ... ## $ termreason_desc : Factor w/ 4 level "Layoff","Not Applicable"...: 2 2 2 2 2 2 2 2 2 2 ... ## $ termtype_desc : Factor w/ 3 level "غیر ارادی"،...: 2 2 2 2 2 2 2 2 2 ... ## $ STATUS_YEAR : int 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 STATUS 2 سطوح ... ## $ ACTIVE"،"TEMINATED": 1 1 1 1 1 1 1 1 1 1 ... ## $ BUSINESS_UNIT : Factor w/ 2 level "HEADOFFICE"،"STORES": 1 1 1 1 1 1 1 1 1 1 .. .

کتابخانه(پلیر)
کتابخانه(dplyr) ## ## پیوست کردن بسته: 'dplyr' ## ## اشیاء زیر از 'package:plyr' پوشانده شده اند: ## ## ترتیب، شمارش، توصیف، failwith، id، جهش، تغییر نام، خلاصه، # # summary ## ## اشیاء زیر از 'package:stats' پوشانده شده اند: ## ## فیلتر، تاخیر ## ## اشیاء زیر از 'package:base' پوشانده شده اند: ## ## intersect, setdiff, setequal ، اتحادیه

نگاه دوم به داده ها – کیفیت داده ها

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

خلاصه(MYdataset) ## EmployeeID recorddate_key تاریخ تولد_key ## Min. :1318 12/31/2013 0:00: 5215 1954-08-04: 40 ## 1st Qu.:3360 12/31/2012 0:00: 5101 1956-04-27: 40: 40 ##31 Median 31/2011 0:00: 4972 1973-03-23: 40 ## میانگین: 4859 12/31/2014 0:00: 4962 1952-01-27: 30 ## سوم چهارم: 63315 101/120 :00: 4840 1952-08-10: 30 ## حداکثر. :8336 12/31/2015 0:00: 4799 1953-10-06: 30 ## (سایر) :19764 (سایر) :49443 ## orighiredate_key terminationdate_key سن طول_خدمت ## 08-1992-1992- 01:42450 دقیقه : 19.00 دقیقه : 0.00 ## 1995-02-22: 50 2014-12-30: 1079 1st Qu.:31.00 1st Qu.: 5.00 ## 2004-12-04: 50 2015-12-30: 6401 Median: 6401 Median. ## 2005-10-16: 50 2010-12-30: 25 Mean :42.08 Mean :10.43 ## 2006-02-26: 50 2012-11-11: 21 3rd Qu.:53.00 #15 Qu. 2006-09-25: 50 2015-02-04: 20 حداکثر. حداکثر :65.00 :26.00 ## (سایر) :49353 (سایر) : 5384 ## نام_شهر_نام_عنوان_شغل ## ونکوور :11211 گوشت :10269 گوشت کوب :9984 ## ویکتوریا : 4885 لبنیات : 859 پروانه : 859 : 8515 Produce Clerk:8237 ## New Westminster: 3211 Bakery : 8381 Baker :8096 ## Kelowna : 2513 Customer Service: 7122 Cashier :6816 ## Burnaby : 2067 Stock Processed Foods (2015 Shelf : 2067) ( سایر) : 856 (سایر) :2308 ## نام فروشگاه جنسیت_جنسی کوتاه_کامل_دلیل_نزولی 
## دقیقه : 1.0 F:25898 Female:25898 Layoff : 1705 ## 1st Qu.:16.0 M:23755 Mare :23755 No Applicable:41853 ## Median :28.0 Resignaton : .2111 ##39 Mean: 42.0 ## حداکثر. :46.0 ## ## termtype_desc STATUS_YEAR STATUS ## غیر ارادی: 1705 دقیقه. :2006 ACTIVE :48168 ## غیر قابل اجرا:41853 1st Qu.:2008 TERMINATED: 1485 ## Voluntary : 6095 Median :2011 ## Mean :2011 ## 3rd Qu.:2013 ## Max. :2015 ## ## واحد_تجاری ## دفتر مرکزی: 585 ## فروشگاه :49068 ## ## ## ## ##

با نگاهی گذرا به خلاصه فوق، چیزی به عنوان مسائل مربوط به کیفیت داده‌ها مشخص نمی‌شود.

مطالب مرتبط: مروری بر معیارهای منابع انسانی

نگاه سوم به داده ها – به طور کلی داده ها به ما چه می گویند؟

قبلاً اشاره کرده بودیم که برای هر یک از 10 سال از 2006 تا 2015، هم رکوردهای فعال در پایان سال و هم در طول سال خاتمه می‌یابد. برای داشتن جمعیتی برای مدل کردن (برای متمایز کردن ACTIVES از TERMINATES) باید هر دو وضعیت را در نظر بگیریم. انواع

در این صورت، دریافت یک خط مبنا از اینکه چه درصدی/نسبی پایانه ها از کل جمعیت است، مفید است. همچنین به سوال اول ما پاسخ می دهد. بیایید در ادامه به آن نگاه کنیم.

چه نسبتی از کارکنان ما می روند؟

StatusCount<- as.data.frame.matrix (MYdataset %>%
group_by (STATUS_YEAR) %>%
(وضعیت) %>% را انتخاب کنید
جدول ())
StatusCount$TOTAL<-StatusCount$ACTIVE + StatusCount$TERMINATED
StatusCount$PercentTerminated <-StatusCount$TERMINATED/(StatusCount$TOTAL)* 100
تعداد وضعیت

## ACTIVE TERMINATED TOTAL درصد پایان یافته است
## 2006 4445 134 4579 2.926403
## 2007 4521 162 4683 3.459321
## 2008 4603 4767 3.440319 164 4603
## 2009 4710 142 4852 2.926628
## 2010 4840 123 4963 2.478340
## 2011 4972 110 5082 2.164502
## 2012 5101 130 5231 2.485184
## 2013 5215 105 5320 1.973684
## 2014 4962 253 5215 4.851390
## 2015 4799 162 4961 3.265471

میانگین (StatusCount$PercentTerminated)

## [1] 2.997124

به نظر می رسد از 1.97 تا 4.85٪ با میانگین 2.99٪ متغیر است.

فسخ کجا اتفاق می افتد؟

بیایید به چند نمودار نگاه کنیم

توسط واحد بازرگانی

کتابخانه (ggplot2)
ggplot () + geom_bar ( aes ( y = ..count..، x = as.factor (BUSINESS_UNIT)، fill = as.factor (STATUS))، data= MYdataset، position = position_stack ())
Graph: Terminations per business unitGraph: Terminations per business unit

به نظر می رسد فسخ در 10 سال گذشته عمدتاً در واحد تجاری STORES رخ داده است. فقط 1 در فناوری HR که در دفتر مرکزی است خاتمه می یابد.

بیایید برای چند لحظه فقط نقاط پایانی را بررسی کنیم.

فقط بر اساس نوع خاتمه و سال وضعیت خاتمه می یابد

TerminatesData<- as.data.frame (MYdataset %>%
فیلتر (وضعیت == "فسخ شده" ))
ggplot () + geom_bar ( aes ( y = ..count..، x = as.factor (STATUS_YEAR)، fill = as.factor (termtype_desc))، data=TerminatesData، position = position_stack ())
Graph: Terminations by type and yearGraph: Terminations by type and year

به طور کلی، به نظر می رسد اکثر فسخ ها سال به سال داوطلبانه هستند، به جز در سال های اخیر که برخی از فسخ های غیرارادی وجود دارد. به هر حال، این نوع بینش ها اغلب در داشبورد نیروی کار گنجانده می شوند.

فقط بر اساس وضعیت سال و دلیل خاتمه خاتمه می یابد

ggplot () + geom_bar ( aes ( y = ..count..، x = as.factor (STATUS_YEAR)، fill = as.factor (termreason_desc))، data=TerminatesData، position = position_stack ())
graph: Terminates By Status Year and reasongraph: Terminates By Status Year and reason

به نظر می‌رسد که اخراج‌هایی در سال‌های 2014 و 2015 رخ داده است که علت آن خاتمه‌های غیرارادی است.

فقط با دلیل فسخ و وزارت خاتمه می یابد

ggplot () + geom_bar ( aes ( y = ..count..، x = as.factor (department_name)، fill = as.factor (termreason_desc))، data=TerminatesData، position = position_stack ())+
 موضوع ( axis.text.x= element_text ( زاویه = 90 , hjust = 1 , vjust = 0.5 ))
Graph: Terminates By Reason and DepartmentGraph: Terminates By Reason and Department

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

سن و مدت خدمت چه تاثیری بر فسخ دارد؟

کتابخانه (کارت)
## بارگیری بسته مورد نیاز: شبکه
featurePlot ( x= MYdataset[, 6:7y= MYdataset$STATUS، نمودار = "دانسیته" ، auto.key = فهرست ( ستون‌ها = 2 ))
Graph: Age and Length of Service Vs terminationGraph: Age and Length of Service Vs termination

نمودارهای چگالی چیزهای جالبی را نشان می دهند. برای پایانه ها، مقداری ارتفاع از 20 تا 30 و یک سنبله در 60 وجود دارد. برای طول خدمت، 5 سنبله وجود دارد. یکی در حدود 1 سال، دیگری حدود 5 سال، و یکی بزرگ حدود 15 سال، و یک زوج در 20 و 25 سال.

سن و طول توزیع خدمات بر اساس وضعیت

featurePlot ( x= MYdataset[, 6:7y= MYdataset$STATUS، نمودار = "جعبه" ، auto.key = فهرست ( ستون‌ها = 2 ))
plot: Age and Length of Service Distributions By Statusplot: Age and Length of Service Distributions By Status

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

این یک نگاه کلی مختصر به برخی از چیزهایی است که داده ها به ما می گویند. قدم بعدی ما ساختن مدل است.

مرتبط: مروری بر معیارهای کلیدی عملکرد کارکنان

مرحله 3 – ساخت مدل

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

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

بیایید داده ها را پارتیشن بندی کنیم

کتابخانه(rattle) ## Rattle: یک رابط گرافیکی رایگان برای داده کاوی با R. ## نسخه 4.0.5 حق چاپ (c) 2006-2015 Togaware Pty Ltd. داده ها
کتابخانه(magrittr) # برای اپراتورهای %>% و %<>%.



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

crv$seed 42 


# یک قاب داده R را بارگیری کنید.
MFG10YearTerminationData read.csv("~/Visual Studio 2015/Projects/EmployeeChurn/EmployeeChurn/MFG10YearTerminationData.csv") MYdataset #ایجاد مجموعه داده های آموزشی و آزمایشی # مجموعه داده های آموزشی و آزمایشی ایجاد کنیدبذر(crv$seed) MYnobs نزدیک(MYdataset) # 52692 مشاهدات 
نمونه من زیر مجموعه(MYdataset,STATUS_YEAR<=2014) MYvalidate NULL MYtest زیر مجموعه(MYdataset,STATUS_YEAR== 2015)

# انتخاب های متغیر زیر ذکر شده است.

ورودی من ج("سن"، "طول_خدمت"، "جنس_پر"، "STATUS_YEAR"، "BUSINESS_UNIT") MYnumeric ج("سن"، "طول_خدمت"، "STATUS_YEAR") MYcategoric ج("gender_full"، "BUSINESS_UNIT") MYtarget "STATUS" MYrisk NULL MYident "EmployeeID" MYignore  ج("recorddate_key"، "birthdate_key"، "orighiredate_key"، "terminationdate_key"، "City_name"، "gender_short"، "termreason_desc"، "termtype_desc"، "Department_name"، "job_title"، "Store_name") MYweights NULL MYTrainingData<-MYtrain[ج(MYinput، MYtarget)] MYTestingData<-MYtest[ج(MYinput، MYtarget)]

انتخاب و اجرای مدل ها

یکی از چیزهایی که R را مشخص می کند این است که تعداد توابع و رویه هایی که می توان استفاده کرد بسیار زیاد است. بنابراین اغلب راه های زیادی برای انجام کارها وجود دارد. دو تا از بهترین بسته‌های R که برای استفاده در علم داده طراحی شده‌اند، caret و rattle هستند.

Caret را در آخرین مقاله وبلاگ معرفی کردیم. در این یکی از Rattle استفاده خواهم کرد. آنچه در مورد Rattle قابل توجه است این است که یک رابط کاربری گرافیکی ارائه می دهد و کد آن را در لاگ موجود در باطن تولید می کند. بنابراین می توانید مدل ها را به سرعت تولید کنید.

من نحوه استفاده از Rattle را در این مقاله به عنوان یک رابط کاربری گرافیکی توضیح نمی دهم، بلکه کد تولید شده را همراه با نتایج آماری و نمودارها نشان می دهم. لطفاً با کد ارائه شده قطع/خاموش نشوید. رابط کاربری گرافیکی تمام کدهای زیر را تولید کرد. من به سادگی تغییرات زیبایی در آن ایجاد کردم. لطفاً روی جریان فرآیند علم داده در مقاله به عنوان نمونه ای از نحوه انجام آن تمرکز کنید. به عنوان یک رابط کاربری گرافیکی، Rattle توانست تمام خروجی زیر را در حدود 15 دقیقه تلاش من تولید کند. یک آموزش در مورد Rattle GUI را می توانید در اینجا پیدا کنید. و اینجا کتابی در مورد راتل است.

ما باید برای لحظه‌ای به عقب برگردیم و آنچه را که اینجا انجام می‌دهیم، و سؤالات آغازین را مرور کنیم. ما می خواهیم پیش بینی کنیم که چه کسی ممکن است در آینده خاتمه دهد. این یک “نتیجه باینری” یا “دسته” است. یک فرد یا “فعال” یا “خاتمه یافته” است. از آنجایی که این یک مقوله قابل پیش‌بینی است، ما از بین مدل‌ها/الگوریتم‌هایی که می‌توانند دسته‌ها را پیش‌بینی کنند، انتخاب می‌کنیم.

مدل هایی که در جغجغه به آنها نگاه خواهیم کرد عبارتند از:

  • درختان تصمیم (rpart)
  • مدل های تقویت شده (adaboost)
  • جنگل های تصادفی (rf)
  • پشتیبانی از مدل‌های Vactor (svm)
  • مدل های خطی (glm)

درخت تصمیم

اجازه می دهد ابتدا نگاهی به مدل درخت تصمیم بیندازیم. این همیشه مفید است، زیرا با استفاده از آنها، می توانید یک مدل درخت بصری برای دریافت ایده ای از چگونگی پیش بینی به روشی آسان به دست آورید.

کتابخانه (جغجغه)
کتابخانه (rpart, quietly= TRUE )

# دانه اعداد تصادفی را بازنشانی کنید تا هر بار نتایج یکسانی بدست آورید. set.seed (crv$seed)

# مدل درخت تصمیم را بسازید.

MYrpart rpart (وضعیت ~ .,
                   data= MYtrain[، c (MYinput، MYtarget)]،
                   روش = "کلاس" ،
                   parms= list (split= "اطلاعات"control= rpart.control (usesurrogate= 0 , 
                                         max surrogate = 0 ))

# یک نمای متنی از مدل درخت تصمیم ایجاد کنید.

#چاپ (MYrpart)
#printcp (MYrpart)
#cat("n")

# زمان صرف شده: 0.63 ثانیه

#================================================= ===========
# مهر زمانی Rattle: 25/03/2016 09:45:25 x86_64-w64-mingw32 

# درخت تصمیم حاصل را رسم کنید. 

# ما از بسته rpart.plot استفاده می کنیم. fancyRpartPlot (MYrpart، اصلی = "Decision Tree MFG10YearTerminationData $ STATUS" )

اکنون می توانیم به سوال خود از بالا پاسخ دهیم:

چه چیز دیگری به آن کمک می کند؟

حتی از خروجی درخت گرافیکی نیز جنسیت به نظر می رسد و سال وضعیت روی آن تأثیر می گذارد.

جنگل های تصادفی

حالا برای جنگل های تصادفی

#================================================= =========== # مهر زمانی Rattle: 2016-03-25 18:21:29 x86_64-w64-mingw32 # Random Forest # بسته 'randomForest' تابع 'randomForest' را ارائه می دهد.کتابخانه(جنگل تصادفی، بی سر و صدا =درست است) ## randomForest 4.6-12 ## rfNews() را تایپ کنید تا ویژگی ها/تغییرات/رفع اشکالات جدید را ببینید. ## ## پیوست کردن بسته: 'randomForest' ## ## شی زیر از 'package:ggplot2' پوشانده شده است: ## ## margin ## ## شی زیر از 'package:dplyr' پوشانده شده است: ## # #ترکیب کنید
# مدل جنگل تصادفی را بسازید.بذر(crv$seed) MYrf جنگل تصادفی(وضعیت ~.،
                                   داده=MYtrain[c(MYinput، MYtarget)]،
                                   ntree=500، mtry=2،
                                   اهمیت=درست است،
                                   na.action=randomForest::na.roughfix،
                                   جایگزین = نادرست)

# خروجی متنی مدل "جنگل تصادفی" تولید کنید.

MYrf ## ## تماس: ## randomForest(فرمول = STATUS ~ ., data = MYtrain[c(MYinput, MYtarget)]، ntree = 500، mtry = 2، اهمیت = TRUE، جایگزین = FALSE، na.action = randomForest ::na.roughfix) ## نوع جنگل تصادفی: طبقه بندی ## تعداد درخت: 500 ## تعداد متغیرهای امتحان شده در هر تقسیم: 2 ## ## تخمین OOB میزان خطا: 1.13% ## ماتریس سردرگمی: ## ACTIVE TERMINATED class.error ## ACTIVE 43366 3 6.917383e-05 ## TERMINATED 501 822 3.786848e-01
# بسته 'pROC' توابع مختلف AUC را پیاده سازی می کند. # مساحت زیر منحنی (AUC) را محاسبه کنید.

PROC::roc(MYrf$y، as.numeric(MYrf$predicted)) ## ## تماس: ## roc.default(response = MYrf$y, predictor = as.numeric(MYrf$predicted)) ## ## داده: as.numeric(MYrf$predicted) در 43369 کنترل (MYrf$y ACTIVE) < 1323 مورد (MYrf$y TERMINATED). ## مساحت زیر منحنی: 0.8106
# فاصله اطمینان AUC را محاسبه کنید.

PROC::ci.auc(MYrf$y، as.numeric(MYrf$پیش‌بینی شده)) ## 95% فاصله اطمینان (CI): 0.7975-0.8237 (DeLong)
# اهمیت متغیرها را فهرست کنید.

rn گرد(جنگل تصادفی::اهمیت(MYrf) 2) rn[سفارش دهید(rn[,3در حال کاهش =درست است),] ## ACTIVE TERMINATED MeanDecreaseAccuracy MeanDecreaseGini ## سن 36.51 139.70 52.45 743.27 ## STATUS_YEAR 35.46 34.13 41.50 64.65 #4 .800. # طول_خدمت 18.37 18.43 21.38 91.71 ## BUSINESS_UNIT 6.06 7.64 8.09 3.58
# زمان صرف شده: 18.66 ثانیه

آدابوست

اکنون برای Adaboost

#================================================= =========== # مهر زمانی Rattle: 2016-03-25 18:22:22 x86_64-w64-mingw32 # Ada Boost # بسته «ada» الگوریتم تقویت را پیاده سازی می کند. # مدل Ada Boost را بسازید.بذر(crv$seed) MYada آدا(وضعیت ~.،
                  داده=MYtrain[c(MYinput، MYtarget)]،
                  کنترل=rpart::rpart.control(maxdepth= 30 ، cp= 0.010000 ، minsplit= 20 ، xval= 10 )، iter= 50 )# نتایج مدلسازی را چاپ کنید.چاپ کنید(MYada) ## تماس: ## ada(STATUS ~ .، داده = MYtrain[c(MYinput، MYtarget)]، control = rpart::rpart.control(maxdepth = 30، ## cp = 0.01، minsplit = 20، xval = 10), iter = 50) ## ## تلفات: نمایی روش: گسسته تکرار: 50 ## ## ماتریس سردرگمی نهایی برای داده: ## پیش‌بینی نهایی ## مقدار واقعی ACTIVE TERMINATED ## ACTIVE 43366 3 ## TERMINATED 501 822 ## ## خطای قطار: 0.011 ## ## خطای خارج از کیسه: 0.011 تکرار= 6 ## ## تخمین اضافی تعداد تکرارها: ## ## train.err1 train.kap1 ## 1 1
گرد(MYada$model$errs[MYada$iter,]، 2) ## train.err train.kap ## 0.01 0.24
گربه("متغیرهایی که واقعاً در ساخت درخت استفاده می شوند:n") ## متغیرهایی که در واقع در ساخت درخت استفاده می شوند:
print(sort(names(listAdaVarsUsed(MYada)))) ## [1] "سن" "جنس_پر" "طول_خدمت" ## [4] "STATUS_YEAR"
گربه('nفرکانس متغیرهای مورد استفاده واقعی:n') ## ## فراوانی متغیرهایی که در واقع استفاده می شوند:
print(listAdaVarsUsed(MYada)) ## ## سن وضعیت_سال طول_خدمت جنسیت_کامل ## 43 41 34 29

ماشین‌های بردار پشتیبانی

حال بیایید به ماشین‌های بردار پشتیبانی نگاه کنیم

#================================================= ===========
# مهر زمانی Rattle: 25/03/2016 18:22:56 x86_64-w64-mingw32 

# ماشین بردار پشتیبانی. 

# بسته 'kernlab' تابع 'ksvm' را ارائه می دهد. کتابخانه (kernlab, quietly= TRUE )
## 
## بسته پیوست: 'kernlab'
## 
## شی زیر از 'package:ggplot2' پوشانده شده است:
## 
## آلفا
# یک مدل ماشین بردار پشتیبان بسازید. set.seed (crv$seed)
MYksvm ksvm ( as.factor (STATUS) ~ .,
               data= MYtrain[c(MYinput، MYtarget)]،
               هسته = "rbfdot",
               prob.model= TRUE )

# یک نمای متنی از مدل SVM ایجاد کنید.

MYksvm
## شیء ماشین بردار پشتیبانی از کلاس "ksvm" 
## 
## نوع SV: C-svc (طبقه بندی) 
پارامتر ##: هزینه C = 1 
## 
## تابع هسته پایه شعاعی گاوسی. 
## هایپرپارامتر: سیگما = 0.365136817631195 
## 
## تعداد بردارهای پشتیبانی : 2407 
## 
## مقدار تابع هدف: -2004.306 
## خطای آموزش: 0.017811 
## مدل احتمال گنجانده شده است.
# زمان صرف شده: 42.91 ثانیه

مدل های خطی

در نهایت بیایید مدل های خطی را بررسی کنیم.

#================================================= =========== # مهر زمانی Rattle: 25/03/2016 18:23:56 x86_64-w64-mingw32 # مدل رگرسیون # یک مدل رگرسیون بسازید.

MYglm glm(وضعیت ~.،
             داده=MYtrain[c(MYinput، MYtarget)]،
             خانواده = دو جمله ای (لینک ="لاجیت"))

# یک نمای متنی از مدل خطی ایجاد کنید.چاپ (خلاصه(MYglm)) ## ## تماس: ## glm(فرمول = STATUS ~ .، خانواده = دوجمله ای (لینک = "logit")، ## داده = MYtrain[c(MYinput، MYtarget)]) ## ## انحراف باقیمانده ها: ## Min 1Q Median 3Q Max ## -1.3245 -0.2076 -0.1564 -0.1184 3.4080 ## ## ضرایب: ## برآورد Std. خطای z مقدار Pr(>|z|) ## (Intercept) -893.51883 33.96609 -26.306 < 2e-16 *** ## سن 0.21944 0.00438 50.095 < 2e-16 *** ## طول خدمت 0.00438 ه -16 *** ## gender_fullMale 0.51900 0.06766 7.671 1.7e-14 *** ## STATUS_YEAR 0.44122 0.01687 26.148 < 2e-16 *** ## BUSINESS -2.6013 2e-16 *** ## -- - ## Signif. کدها: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## (پارامتر پراکندگی برای خانواده دوجمله ای 1 گرفته شده است) ## ## انحراف تهی: 11920.1 در 44691 درجه آزادی ## انحراف باقیمانده: 9053.3 در 44686 درجه آزادی ## AIC: 3 ##9065. ## تعداد تکرارهای امتیازدهی فیشر: 7
گربه (sprintf("احتمال گزارش: %.3f (%d df)n"،
            logLik(MYglm)[1attr(logLik(MYglm) "df"))) ## احتمال ثبت: -4526.633 (6 df)
گربه (sprintf("تفاوت انحراف تهی/باقیمانده: %.3f (%d df)n", MYglm$null.deviance-MYglm$deviance, MYglm$df.null-MYglm$df.residual)) ## تفاوت انحراف تهی/باقیمانده: 2866.813 (5 df)
گربه (sprintf("P-value Chi-square: %8fn"،
            dchisq(MYglm$null.deviance-MYglm$deviance، MYglm$df.null-MYglm$df.residual))) ## مجذور کای p-value: 0.00000000
گربه (sprintf("Pseudo R-Square (خوشبینانه): %8fn", cor(MYglm$y, MYglm$fitted.values))) ## شبه R-Square (خوشبینانه): 0.38428451
گربه('n==== ANOVA ====nn') ## ## ==== ANOVA ====
چاپ (آنووا(MYglm، test="چیسک")) ## تجزیه و تحلیل جدول انحراف ## ## مدل: دو جمله ای، پیوند: logit ## ## پاسخ: STATUS ## ## شرایط به ترتیب اضافه شده (اول به آخرین) ## ## ## Df Deviance Resid. دی اف رزید. Dev Pr(>Chi) ## NULL 44691 11920.1 ## سن 1 861.75 44690 11058.3 < 2.2e-16 *** ## طول_خدمت 1 1094.72 44689 9963.6 #1.2-1. 44688 9949.2 0.0001494 * ** ## STATUS_YEAR 1 716.39 44687 9232.8 < 2.2e-16 *** ## BUSINESS_UNIT 1 179.57 44686 9053.3 < 2.2e-16 *** ## --- ## Signif. کدها: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 "" 1
گربه("n")
# زمان صرف شده: 1.62 ثانیه

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

مدل ها را ارزیابی کنید

در مرحله ارزیابی مدل، می‌توانیم به 2 سوال اصلی خود که در ابتدا بیان شد پاسخ دهیم:

آیا می توانیم پیش بینی کنیم؟

در یک کلمه “بله”.

چقدر خوب می توانیم پیش بینی کنیم؟

در دو کلمه “نسبتا خوب”.

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

اولین آنها ماتریس های خطا هستند. در ماتریس های خطا، شما نتایج واقعی را با نتایج پیش بینی شده جدول بندی می کنید. اگر پیش‌بینی 100% «کامل» بود، هر پیش‌بینی همان واقعی بود. این تقریبا هرگز اتفاق نمی افتد. هر چه میزان پیش‌بینی صحیح بیشتر و میزان خطا کمتر باشد، بهتر است.

ماتریس های خطا

درختان تصمیم

#================================================= =========== # مهر زمانی Rattle: 2016-03-25 18:50:22 x86_64-w64-mingw32 # عملکرد مدل را ارزیابی کنید. # یک ماتریس خطا برای مدل درخت تصمیم ایجاد کنید. # پاسخ را از مدل درخت تصمیم دریافت کنید. پیش بینی MYpr(MYrpart, newdata=MYtest[ج(MYinput، MYtarget)]، نوع="کلاس")

# ایجاد ماتریس سردرگمی که تعداد را نشان می دهد.جدول(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr،
      dnn= c("واقعی"، "پیش بینی شده")) ## پیش بینی شده ## واقعی ACTIVE خاتمه یافته ## ACTIVE 4799 0 ## TERMINATED 99 63
# ایجاد ماتریس سردرگمی نشان دهنده نسبت.

pcme جدول(واقعی، cl) nc نزدیک(x) tbl cbind(x/طول(واقعی)
               Error= sapply(1:nc، تابع(r) دور (مجموع(x[r,-r])/مجموع(x[r,])، 2)))
  نام ها (attr(Tbl, "دیمنام ها")) ج("واقعی"، "پیش بینی شده")
  بازگشت(tbl) } در هر pcme(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr)
گرد(در هر، 2) ## پیش بینی شده ## خطای واقعی ACTIVE TERMINATED ## ACTIVE 0.97 0.00 0.00 ## TERMINATED 0.02 0.01 0.61
# درصد خطای کلی را محاسبه کنید.cat( 100 *round(1-sum(Diag(در هر)، na.rm=درست است) 2)) ## 2
# میانگین درصد خطای کلاس را محاسبه کنید.گربه ( 100 * گرد (میانگین(در هر[،"خطا"na.rm=درست است) 2)) ## 30

آدابوست

# یک ماتریس خطا برای مدل Ada Boost ایجاد کنید. # پاسخ را از مدل Ada Boost دریافت کنید.

MYpr پیش بینی کنید(Myada, newdata=MYtest[ج(MYinput، MYtarget)])

# ایجاد ماتریس سردرگمی نشان دهنده تعداد.جدول(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr،
      dnn= c("واقعی"، "پیش بینی شده")) ## پیش بینی شده ## واقعی ACTIVE خاتمه یافته ## ACTIVE 4799 0 ## TERMINATED 99 63
# ایجاد ماتریس سردرگمی نشان دهنده نسبت.

pcme جدول(واقعی، cl) nc نزدیک(x) tbl cbind(x/طول(واقعی)
               Error= sapply(1:nc، تابع (r) دور (مجموع(x[r,-r])/مجموع(x[r,])، 2)))
  نام ها (attr(Tbl, "دیمنام ها")) ج("واقعی"، "پیش بینی شده")
  بازگشت(tbl) } در هر pcme(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr)
گرد(در هر، 2) ## پیش بینی شده ## خطای واقعی ACTIVE TERMINATED ## ACTIVE 0.97 0.00 0.00 ## TERMINATED 0.02 0.01 0.61
# درصد خطای کلی را محاسبه کنید.cat( 100 *round( 1- sum(Diag(برای)، na.rm=درست است) 2)) ## 2
# میانگین درصد خطای کلاس را محاسبه کنید.گربه ( 100 * گرد (میانگین(در[،"خطا"na.rm=درست است) 2)) ## 30

جنگل تصادفی

# یک ماتریس خطا برای مدل جنگل تصادفی ایجاد کنید. # پاسخ را از مدل جنگل تصادفی دریافت کنید.

MYpr پیش بینی کنید(MYrf، newdata= na.omit(MYtest[ج(MYinput، MYtarget)]))

# ایجاد ماتریس سردرگمی نشان دهنده تعداد.جدول ( na.omit(MYtest[c(MYinput، MYtarget])]$STATUS، MYpr،
      dnn= c("واقعی"، "پیش بینی شده")) ## پیش بینی شده ## واقعی ACTIVE خاتمه یافته ## ACTIVE 4799 0 ## TERMINATED 99 63
# ماتریس سردرگمی را که نسبت ها را نشان می دهد ایجاد کنید.

pcme جدول(واقعی، cl) nc نزدیک(x) tbl cbind(x/طول(واقعی)
               Error= sapply(1:nc، تابع (r) دور (مجموع(x[r,-r])/مجموع(x[r,])، 2)))
  نام ها (attr(Tbl, "دیمنام ها")) ج("واقعی"، "پیش بینی شده")
  بازگشت(tbl) } در هر pcme(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr)
گرد(در هر، 2) ## پیش بینی شده ## خطای واقعی ACTIVE TERMINATED ## ACTIVE 0.97 0.00 0.00 ## TERMINATED 0.02 0.01 0.61
# درصد خطای کلی را محاسبه کنید.cat( 100 *round( 1- sum(Diag(برای)، na.rm=درست است) 2)) ## 2
# میانگین درصد خطای کلاس را محاسبه کنید.گربه ( 100 * گرد (میانگین(در[،"خطا"na.rm=درست است) 2)) ## 30

مدل بردار پشتیبان

# یک ماتریس خطا برای مدل SVM ایجاد کنید. # پاسخ را از مدل SVM دریافت کنید.

MYpr پیش بینی کنید(MYksvm, newdata= na.omit(MYtest[c(MYinput، MYtarget)]))

# ایجاد ماتریس سردرگمی نشان دهنده تعداد.جدول ( na.omit(MYtest[c(MYinput، MYtarget])]$STATUS، MYpr،
      dnn= c("واقعی"، "پیش بینی شده")) ## پیش بینی شده ## واقعی ACTIVE خاتمه یافته ## ACTIVE 4799 0 ## TERMINATED 150 12
# ایجاد ماتریس سردرگمی نشان دهنده نسبت.

pcme جدول(واقعی، cl) nc نزدیک(x) tbl cbind(x/طول(واقعی)
               Error= sapply(1:nc، تابع (r) دور (مجموع(x[r,-r])/مجموع(x[r,])، 2)))
  نام ها (attr(Tbl, "دیمنام ها")) ج("واقعی"، "پیش بینی شده")
  بازگشت(tbl) } در هر pcme(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr)
گرد(در هر، 2) ## پیش بینی شده ## خطای واقعی ACTIVE TERMINATED ## ACTIVE 0.97 0 0.00 ## TERMINATED 0.03 0 0.93
# درصد خطای کلی را محاسبه کنید.cat( 100 *round( 1- sum(Diag(برای)، na.rm=درست است) 2)) ## 3
# میانگین درصد خطای کلاس را محاسبه کنید.گربه ( 100 * گرد (میانگین(در[،"خطا"na.rm=درست است) 2)) ## 46

مدل خطی

# یک ماتریس خطا برای مدل خطی ایجاد کنید. # پاسخ را از مدل Linear بدست آورید.

MYpr as.vector(ifelse(predict(MYglm, نوع=سبز: "پاسخ"، newdata=MYtest[ج(MYinput، MYtarget)]) > 0.5، سبز: "فسخ شده"، "فعال"))

# ایجاد ماتریس سردرگمی نشان دهنده تعداد.جدول ( na.omit(MYtest[c(MYinput، MYtarget])]$STATUS، MYpr،
      dnn= c("واقعی"، "پیش بینی شده")) ## پیش بینی شده ## واقعی ACTIVE ## ACTIVE 4799 ## TERMINATED 162
# ایجاد ماتریس سردرگمی نشان دهنده نسبت.

pcme جدول(واقعی، cl) nc نزدیک(x) tbl cbind(x/طول(واقعی)
               Error= sapply(1:nc، تابع (r) دور (مجموع(x[r,-r])/مجموع(x[r,])، 2)))
  نام ها (attr(Tbl, "دیمنام ها")) ج("واقعی"، "پیش بینی شده")
  بازگشت(tbl) } در هر pcme(MYtest[c(MYinput، MYtarget)]$STATUS، MYpr)
گرد(در هر، 2) ## پیش بینی شده ## خطای واقعی ACTIVE ## ACTIVE 0.97 0 ## TERMINATED 0.03 1
# درصد خطای کلی را محاسبه کنید.cat( 100 *round( 1- sum(Diag(برای)، na.rm=درست است) 2)) ## -97
# میانگین درصد خطای کلاس را محاسبه کنید.گربه ( 100 * گرد (میانگین(در[،"خطا"na.rm=درست است) 2))

خب جالب بود!

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

ناحیه زیر منحنی (AUC)

روش دیگر برای ارزیابی مدل ها AUC است. هر چه AUC بالاتر باشد بهتر است. کد زیر اطلاعات لازم برای تولید نمودارها را تولید می کند.

#================================================= =========== # مهر زمانی Rattle: 2016-03-25 19:44:22 x86_64-w64-mingw32 # عملکرد مدل را ارزیابی کنید. # ROC Curve: به بسته ROCR نیاز دارد. کتابخانه (ROCR) ## بارگیری بسته مورد نیاز: gplots ## ## پیوست کردن بسته: 'gplots' ## ## شی زیر از 'package:stats' پوشانده شده است: ## ## lowess # ROC Curve: به بسته ggplot2 نیاز دارد . کتابخانه (ggplot2, quietly= TRUE ) # یک منحنی ROC برای مدل rpart در MFG10YearTerminationData [تست] ایجاد کنید. پیش بینی MYpr(MYrpart, newdata=MYtest[ج(MYinput، MYtarget)])[،2]

# مشاهدات با هدف گم شده را حذف کنید.

نه خانم   حذف کردن(MYtest[c(MYinput, MYtarget)]$STATUS) miss.list attr(نه، خانم، "na.action")
صفات(no.miss) NULL اگر (طول(miss.list)) { pred پیش بینی(MYpr[-miss.list], no.miss) } else { pred پیش بینی(MYpr، no.miss) } pe عملکرد(پیش، "tpr"، "fpr") au عملکرد(پیش، "auc")@y.values[[1]] پی دی داده.قاب(fpr= از لیست خارج کردن([ایمیل محافظت شده])، tpr= فهرست نشدن([ایمیل محافظت شده])) ص ggplot(پی دی، aes(x=fpr، y=tpr)) p geom_line(رنگ ="قرمز") ص xlab>("نرخ مثبت کاذب") + یلب("نرخ مثبت واقعی") ص ggtitle("ROC Curve Decision Tree MFG10YearTerminationData [تست] وضعیت") ص موضوع(plot.title= element_text(اندازه =10)) ص geom_line(data= data.frame() aes(x= c(0,1) y=c(0,1)) رنگ ="خاکستری") ص حاشیه نویسی کنید("متن"، x= 0.50 ، y= 0.00 ، hjust= 0 ، vjust= 0 ، اندازه= 5،
                 برچسب = چسباندن("AUC="، گرد(آو، 2)))
چاپ کنید(ص)
Graph: Area Under CurveGraph: Area Under Curve
# مساحت زیر منحنی را برای نمودار محاسبه کنید. # مشاهدات با هدف گم شده را حذف کنید.

نه خانم   حذف کردن(MYtest[c(MYinput, MYtarget)]$STATUS) miss.list attr(نه، خانم،"na.action")
صفات(بدون خانم) قهوه ای NULL

اگر (طول(miss.list)) { pred پیش بینی(MYpr[-miss.list], no.miss) } else { pred پیش بینی(MYpr، no.miss) }
عملکرد(پیش، "auc") ## یک شی از کلاس "performance" ## Slot "x.name": ## [1] "None" ## ## Slot "y.name": ## [1] "Area under the ROC curve" ## ## اسلات "alpha.name": ## [1] "none" ## ## اسلات "x.values": ## list() ## ## اسلات "y.values": ## [[ 1]] ## [1] 0.6619685 ## ## ## اسلات "alpha.values": ## list() # ROC Curve: به بسته ROCR نیاز دارد.

کتابخانه(ROCR)

# ROC Curve: به بسته ggplot2 نیاز دارد.کتابخانه(ggplot2, بی سر و صدا =درست است)

# یک منحنی ROC برای مدل ada در [تست] MFG10YearTerminationData ایجاد کنید.

MYpr <- پیش بینی کنید(Myada, newdata=MYtest[ج(MYinput، MYtarget)]، نوع="مسئله")[،2]

# مشاهدات با هدف گم شده را حذف کنید.

نه خانم   حذف کردن(MYtest[c(MYinput, MYtarget)]$STATUS) miss.list attr(نه، خانم، "na.action")
صفات(بدون خانم) قهوه ای NULL
اگر (طول(miss.list)) { pred پیش بینی(MYpr[-miss.list], no.miss) } else { pred پیش بینی(MYpr، no.miss) } pe عملکرد(پیش، "tpr"، "fpr") au عملکرد(پیش، "auc")@y.values[[1]] پی دی داده.قاب(fpr= از لیست خارج کردن([ایمیل محافظت شده])، tpr= فهرست نشدن([ایمیل محافظت شده])) ص ggplot(پی دی، aes(x=fpr، y=tpr)) p geom_line(رنگ ="قرمز") ص xlab>("نرخ مثبت کاذب") + یلب("نرخ مثبت واقعی") ص ggtitle("ROC Curve Ada Boost MFG10YearTerminationData [تست] وضعیت") ص موضوع(plot.title= عنصر_متن(اندازه =10)) ص geom_line(data= data.frame() aes(x= c(0,1) y=c(0,1)) رنگ ="خاکستری") ص حاشیه نویسی کنید("متن"، x= 0.50 ، y= 0.00 ، hjust= 0 ، vjust= 0 ، اندازه= 5،
                 برچسب = چسباندن("AUC="، گرد(آو، 2)))
چاپ کنید(ص)
Graph: AUC Ada BoostGraph: AUC Ada Boost
# مساحت زیر منحنی را برای نمودار محاسبه کنید. # مشاهدات با هدف گم شده را حذف کنید.

نه خانم   حذف کردن(MYtest[c(MYinput, MYtarget)]$STATUS) miss.list attr(نه، خانم،"na.action")
صفات(بدون خانم) قهوه ای NULL

اگر (طول(miss.list)) { pred پیش بینی(MYpr[-miss.list], no.miss) } else { pred پیش بینی(MYpr، no.miss) }
عملکرد(پیش، "auc") ## یک شی از کلاس "performance" ## Slot "x.name": ## [1] "None" ## ## Slot "y.name": ## [1] "Area under the ROC curve" ## ## اسلات "alpha.name": ## [1] "none" ## ## اسلات "x.values": ## list() ## ## اسلات "y.values": ## [[ 1]] ## [1] 0.7525726 ## ## ## اسلات "alpha.values": ## list()
# ROC Curve: به بسته ROCR نیاز دارد.کتابخانه(ROCR)

# ROC Curve: به بسته ggplot2 نیاز دارد.کتابخانه(ggplot2, بی سر و صدا =درست است) # یک منحنی ROC برای مدل rf در [تست] MFG10YearTerminationData ایجاد کنید. MYpr <- پیش بینی کنید(MYrf، newdata= na.omit(MYtest[ج(MYinput، MYtarget)])، type="مسئله")[،2]

# مشاهدات با هدف گم شده را حذف کنید.

نه خانم <- حذف کردن(na.omit(MYtest[c(MYinput، MYtarget)])$STATUS) miss.list <- attr(نه، خانم، "na.action")
صفات(بدون خانم) قهوه ای NULL
اگر (طول(miss.list)) pred <- پیش بینی(MYpr[-miss.list]، no.miss) } else { pred <- پیش بینی(MYpr، no.miss) } pe <- عملکرد(پیش، "tpr"، "fpr") او <- عملکرد(پیش، "auc")@y.values[[1]] پی دی <- داده.قاب(fpr= از لیست خارج کردن([ایمیل محافظت شده])، tpr= از لیست خارج کردن([email protected])) p <- ggplot(پی دی، aes(x=fpr، y=tpr)) p <- geom_line(رنگ ="قرمز") p <- xlab>("نرخ مثبت کاذب") + یلب("نرخ مثبت واقعی") p <- ggtitle("منحنی ROC Random Forest MFG10YearTerminationData [تست] وضعیت") p <- موضوع(plot.title= عنصر_متن(اندازه =10)) p <- geom_line(data= data.frame() aes(x= c(0,1) y=c(0,1)) رنگ ="خاکستری") p <- حاشیه نویسی کنید("متن"، x= 0.50 ، y= 0.00 ، hjust= 0 ، vjust= 0 ، اندازه= 5،
                 برچسب = چسباندن("AUC="، گرد(آو، 2)))
چاپ کنید(ص)
Graph: ROC Curve Random ForestGraph: ROC Curve Random Forest
# مساحت زیر منحنی را برای نمودار محاسبه کنید. # مشاهدات با هدف گم شده را حذف کنید.

نه خانم <- na.omit(na.omit(MYtest[c(MYinput، MYtarget)])$STATUS) miss.list <- attr(نه، خانم،"na.action")
صفات(no.miss) <- NULL

اگر (طول(miss.list)) { pred <- پیش بینی(MYpr[-miss.list]، no.miss) } else { pred <- پیش بینی(MYpr، no.miss) }
عملکرد(پیش، "auc") ## یک شی از کلاس "performance" ## Slot "x.name": ## [1] "None" ## ## Slot "y.name": ## [1] "Area under the ROC curve" ## ## اسلات "alpha.name": ## [1] "none" ## ## اسلات "x.values": ## list() ## ## اسلات "y.values": ## [[ 1]] ## [1] 0.7332874 ## ## ## اسلات "alpha.values": ## list()
# ROC Curve: به بسته ROCR نیاز دارد.کتابخانه(ROCR)

# ROC Curve: به بسته ggplot2 نیاز دارد.کتابخانه(ggplot2, بی سر و صدا =درست است)

# یک منحنی ROC برای مدل ksvm در [تست] MFG10YearTerminationData ایجاد کنید.

MYpr <- kernlab::پیش بینی کنید(MYksvm, newdata= na.omit(MYtest[c(MYinput، MYtarget)])، نوع="احتمالات")[،2]

# مشاهدات با هدف گم شده را حذف کنید.

نه خانم <- حذف کردن(حذف کردن(MYtest[c(MYinput، MYtarget)])$STATUS) miss.list <- attr(نه، خانم، "na.action")
صفات(بدون خانم) قهوه ای NULL
اگر (طول(miss.list)) { pred <- پیش بینی(MYpr[-miss.list]، no.miss) } else { pred <- پیش بینی(MYpr، no.miss) } pe <- عملکرد(پیش، "tpr"، "fpr") یا <- عملکرد(پیش، "auc")@y.values[[1]] پی دی <- داده.قاب(fpr= از لیست خارج کردن([ایمیل محافظت شده])، tpr= فهرست نشدن([email protected])) p <- ggplot(پی دی، aes(x=fpr، y=tpr)) p <- geom_line(رنگ ="قرمز") p <- xlab>("نرخ مثبت کاذب") + یلب("نرخ مثبت واقعی") p <- ggtitle("ROC Curve SVM MFG10YearTerminationData [تست] وضعیت") p <- موضوع(plot.title= element_text(اندازه=10)) p <- geom_line(data= data.frame() aes(x= c(0,1) y=c(0,1)) رنگ ="خاکستری") p <- حاشیه نویسی کنید("متن"، x= 0.50 ، y= 0.00 ، hjust= 0 ، vjust= 0 ، اندازه= 5،
                 برچسب = چسباندن("AUC="، گرد(آو، 2)))
چاپ کنید(ص)
ROC Curve SVMROC Curve SVM
# مساحت زیر منحنی را برای نمودار محاسبه کنید. # مشاهدات با هدف گم شده را حذف کنید.

نه خانم <- na.omit(na.omit(MYtest[c(MYinput، MYtarget)])$STATUS) miss.list <- attr(نه، خانم،"na.action")
صفات(no.miss) <- NULL

اگر (طول(miss.list)) { pred <- پیش بینی(MYpr[-miss.list]، no.miss) } else { pred <- پیش بینی(MYpr، no.miss) }
عملکرد(پیش، "auc") ## یک شی از کلاس "performance" ## Slot "x.name": ## [1] "None" ## ## Slot "y.name": ## [1] "Area under the ROC curve" ## ## اسلات "alpha.name": ## [1] "none" ## ## اسلات "x.values": ## list() ## ## اسلات "y.values": ## [[ 1]] ## [1] 0.679458 ## ## ## اسلات "alpha.values": ## list()
# ROC Curve: به بسته ROCR نیاز دارد.کتابخانه(ROCR)

# ROC Curve: به بسته ggplot2 نیاز دارد.کتابخانه(ggplot2, بی سر و صدا =درست است)

# یک منحنی ROC برای مدل glm در [تست] MFG10YearTerminationData ایجاد کنید.
 
 MYpr <- پیش بینی (MYglm، type="پاسخ"، newdata=MYtest[ج(MYinput، MYtarget)])

# مشاهدات با هدف گم شده را حذف کنید.

نه خانم <- حذف کردن(MYtest[c(MYinput, MYtarget)]$STATUS) miss.list <- attr(نه، خانم، "na.action")
صفات(بدون خانم) قهوه ای NULL
اگر (طول(miss.list)) { pred <- پیش بینی(MYpr[-miss.list]، no.miss) } else { pred <- پیش بینی(MYpr، no.miss) } pe <- عملکرد(پیش، "tpr"، "fpr") یا <- عملکرد(پیش، "auc")@y.values[[1]] پی دی <- داده.قاب(fpr= از لیست خارج کردن([ایمیل محافظت شده])، tpr= فهرست نشدن([email protected])) p <- ggplot(پی دی، aes(x=fpr، y=tpr)) p <- geom_line(رنگ ="قرمز") p <- xlab>("نرخ مثبت کاذب") + یلب("نرخ مثبت واقعی") p <- ggtitle("منحنی ROC خطی MFG10YearTerminationData [تست] وضعیت") p <- موضوع(plot.title= عنصر_متن(اندازه =10)) p <- geom_line(data= data.frame() aes(x= c(0,1) y=c(0,1)) رنگ="خاکستری") p <- حاشیه نویسی کنید("متن"، x= 0.50 ، y= 0.00 ، hjust= 0 ، vjust= 0 ، اندازه= 5،
                 برچسب = چسباندن("AUC="، گرد(آو، 2)))
چاپ کنید(ص)
Graph: ROC Curve LinearGraph: ROC Curve Linear
# مساحت زیر منحنی را برای نمودار محاسبه کنید.


# مشاهدات با هدف گم شده را حذف کنید.

no.miss <- na.omit (MYtest[c(MYinput, MYtarget)]$STATUS)
miss.list <- attr (no.miss، " na.action" )
ویژگی ها (no.miss) <- NULL

if ( طول (miss.list))
{
  pred <- پیش بینی (MYpr[-miss.list]، no.miss)
} دیگر
{
  pred <- پیش بینی (MYpr، no.miss)
}
عملکرد (پیش، "auc" )
## یک شی از کلاس "performance"
## اسلات "x.name":
## [1] "هیچ"
## 
## اسلات "y.name":
## [1] "مساحت زیر منحنی ROC"
## 
## اسلات "alpha.name":
## [1] "هیچ"
## 
## اسلات "x.values":
لیست ##()
## 
## اسلات "y.values":
## [[1]]
## [1] 0.4557386
## 
## 
## اسلات "alpha.values":
لیست ##()

چند نکته قابل توجه:

  • به نظر می رسد که مدل Adaboost بالاترین AUC را تولید می کند. بنابراین ما از آن برای پیش بینی پایان سال 2016 در مدت کمی استفاده خواهیم کرد.
  • مدل خطی بدترین بود.

ارائه نتایج و سند

تمامی فایل ها (کد، فایل داده csv و فرمت های منتشر شده) این مقاله وبلاگ را می توانید در لینک زیر مشاهده کنید.

نتایج با استفاده از زبان R Markdown ارائه شده است. مقاله در آن نوشته شده است. این فایل rmd است که در لینک ارائه شده است. R Markdown امکان ادغام درون خطی کد R، نتایج و نمودارها را با مطالب متنی این مقاله وبلاگ فراهم می کند. و می توان آن را در قالب های Word، HTML یا PDF منتشر کرد.

اگر می‌خواهید هر کدام از کدهای این مقاله را اجرا کنید، باید فایل‌های CSV را دانلود کنید و تغییراتی در اطلاعات مسیر در کد R ایجاد کنید تا متناسب با جایی که فایل CSV را قرار داده‌اید.

استقرار مدل

بیایید پایان سال 2016 را پیش بینی کنیم.

در زندگی واقعی شما می توانید یک عکس فوری از داده ها در پایان سال 2015 برای کارمندان فعال بگیرید. برای اهداف این تمرین، ما این کار را انجام می دهیم، اما داده ها را نیز تغییر می دهیم تا اطلاعات مربوط به سال خدمت هر دو – 1 سال بیشتر برای سال 2016 باشد.

#Apply Model #Generate 2016 data Employees2016 #2015 data

ActiveEmployees2016<-زیر مجموعه(Employees2016, STATUS=="فعال") ActiveEmployees2016$age<-ActiveEmployees2016$age+1
ActiveEmployees2016$length_of_service<-ActiveEmployees2016$length_of_service+1#پیش‌بینی ۲۰۱۶ با استفاده از adaboost خاتمه می‌یابد #MYada نامی بود که قبلاً به مدل adaboost داده بودیم.
ActiveEmployees2016$PredictedSTATUS2016<-پیش بینی کنید(MYada,ActiveEmployees2016) PredictedTerminatedEmployees2016<-زیر مجموعه(ActiveEmployees2016,PredictedSTATUS2016=="فسخ شده")
#نمایش رکوردهای 5 پیش بینی اولسر(PredictedTerminatedEmployees2016) ## EmployeeID recorddate_key birthdate_key ## 1551 1703 12/31/2015 0:00 1951-01-13 1990-09-23 21/01/21 201/21 51-01-15 1990- 09-24 ## 1571 1706 12/31/2015 0:00 1951-01-20 1990-09-27 ## 1581 1710 12/31/2015 0:00 1951-02-01-24 #01-01-24 1713 12/31/2015 0:00 1951-01-27 1990-10-01 ## 1611 1715 12/31/2015 0:00 1951-01-31 1990-10-03 1990-10-03 #key_deate#10-03_1990 #key_date_5 1900-01-01 65 26 ونکوور ## 1561 1900-01-01 65 26 ریچموند ## 1571 1900-01-01 65 26 کلونا ## 1581 1900-01-01 01-01-01 جورج 01 #01-01-01 جرج 01 #01 65 26 ونکوور ## 1611 1900-01-01 65 26 ریچموند ## نام_دپارتمان_عنوان_عنوان_فروشگاه_نام جنسیت_کوتاه ## 1551 Meats Meats Manager 43 F ## 1561 Meats Meats Manager 29 M ## Meats Meats Manager 29 M ## Meats Meats Manager 29 M ## Meats Meater #157 Customer Service Manager 26 M ## 1600 Produce Produce Manager 43 F ## 1611 Produce Produce Manager 29 F ## gender_full termreason_desc termtype_desc STATUS_YEAR STATUS ## 1551 Female غیر قابل اجرا نیست 2015 قابل اجرا نیست #5 AC 15 قابل اجرا نیست VE ## 1571 مرد غیر قابل اجرا غیر قابل اجرا 2015 ACTIVE
## 1581 مرد غیر قابل اجرا نیست 2015 ACTIVE ## 1600 زن غیر قابل اجرا نیست 2015 ACTIVE ## 1611 زن غیر قابل اجرا نیست 2015 ACTIVE ## BUSINESS_UNIT Predicted MIN#1#5TORES ES TERMINATED ## 1571 STORES TERMINATED # # 1581 فروشگاه خاتمه یافت ## 1600 فروشگاه پایان یافت ## 1611 فروشگاه پایان یافت

93 خاتمه پیش بینی شده برای سال 2016 وجود داشت.

بسته بندی کنید

هدف از این مقاله وبلاگ این بود:

  • برای نشان دادن یک مثال People Analytics با استفاده از R
  • برای نشان دادن یک مثال معنادار از زمینه منابع انسانی
  • لزوماً نمونه ای از بهترین شیوه ها نیست، بلکه نمونه ای گویا است
  • برای ایجاد انگیزه در جامعه منابع انسانی برای استفاده گسترده تر از تصمیم گیری منابع انسانی «داده محور».
  • برای تشویق کسانی که علاقه مند به استفاده از R در علم داده هستند تا عمیق تر در ابزارهای R در این زمینه تحقیق کنند.

از منظر عملی، اگر این داده‌های واقعی از یک سازمان واقعی بود، تمرکز بر سازمان خواهد بود تا درباره آنچه که داده‌ها به آنها می‌گوید، «تصمیم‌گیری» بگیرد. ناتوانی در انجام این کار را فلج تجزیه و تحلیل می نامند.

اگر می خواهید درباره انجام تجزیه و تحلیل منابع انسانی در R، از جمله تجزیه و تحلیل انحراف، تجزیه و تحلیل تعامل، تجسم داده ها و موارد دیگر بیشتر بدانید، دوره ما را در مورد تجزیه و تحلیل پیش بینی در آکادمی AIHR بررسی کنید.

لیندون یک مشاور مستقل در تحلیل مردم/HR است. با بیش از 35 سال تجربه در زمینه منابع انسانی و فناوری اطلاعات در نقش های مختلف، یک موضوع مشترک در همه این موارد، پرداختن به سوالات مهم منابع انسانی سازمانی با کاربرد فناوری و آمار در داده های منابع انسانی بوده است. با Lyndon در [email protected] تماس بگیرید یا با Lyndon در LinkedIn ارتباط برقرار کنید

منبع


برچسب‌ها:

دیدگاه‌ها

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

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