بازاریابی داده محور | تصمیم گیری داده محور | کلان داده | آنالیز داده | داده کاوی | هوش بازاریابی | استراتژی بازاریابی

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

پیدا کردن یک شغل خوب در حوزه «داده‌کاوی» (Data Mining) کار ساده‌ای نیست. دانستن چگونگی کار با کتابخانه‌هایی مانند«سایکیت‌لِرن» (scikit-learn) و «ggplot۲» برای کسب یک فرصت شغلی مناسب کفایت نمی‌کند. پرسشی که در این وهله مطرح می‌شود این است که راهکار پیدا کردن یک شغل خوب در زمینه داده‌کاوی چیست؟! راه حل، انجام پروژه‌های عملی است که بتوانند مهارت فرد را در تحلیل داده و کار با ابزارها نشان دهند. یکی از گزینه‌های خوب در این راستا انجام تحلیل جهت نشان دادن «تاثیر کسب‌و‌کار» (Business Impact) است. منظور از «تاثیر کسب‌و‌کار» چیست؟ هر کسب‌و‌کاری در پایان روز روی چیزی کار می‌کند که مربوط به بخش تجاری کارهای آن است. این موضوع می‌تواند کاهش هزینه‌ها، افزایش درآمد، بهبود تجربه مشتریان و مواردی مانند این‌ها باشد. در این مطلب چگونگی ساخت یک مدل «پیش بینی ریزش مشتریان» (Customer Churn) که مساله مهمی در تاثیر کسب‌و‌کار محسوب می‌شود، به صورت گام به گام آموزش داده خواهد شد. مباحثی که در ادامه مورد بررسی قرار می‌گیرند به شرح زیر هستند:

  • زمینه کسب‌و‌کار
  • رگرسیون لجستیک
  • آماده‌سازی داده‌ها
  • «برازش» (Fitting) مدل
  • انجام پیش‌بینی
  • تاثیر کسب‌و‌کار

زمینه کسب‌و‌کار

در آغاز هر پروژه «علم داده» (Data Science) جهان واقعی، نیاز به پرسیدن چند سوال است. برخی از آن‌ها در ادامه بیان شده‌اند.

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

اکنون، در ادامه موضوع رویگردانی مشتریان، فرض می‌شود که داده‌کاو در یک شرکت مخابراتی کار می‌کند. یک روز رئیس شرکت از او می‌پرسد: «چگونه می‌توانیم کسب‌و‌کار خودمان را با استفاده از داده‌های موجود ارتقا دهیم؟».

مساله‌ای که قرار است حل شود چیست؟

داده‌کاو پس از بررسی داده‌های موجود، متوجه می‌شود به دست آوردن مشتری جدید نسبت به حفظ مشتریان موجود پنج برابر هزینه بیشتری برای سازمان در پی دارد. اکنون سوالی که بیشتر روی آن متمرکز می‌شود این است که: «چگونه می‌توان نرخ حفظ مشتری را افزایش داد تا هزینه‌ها کاهش پیدا کنند؟».

راهکار بالقوه چیست؟

برای دسترسی داشتن به داده‌های مشتریان، می‌توان یک مدل یادگیری ماشین را ساخت که «رویگردانی مشتریان» را پیش‌بینی کند. برای ممانعت از پیچیده شدن مسائل با چیزی که بسیار خلاصه و قابل ارائه به مدیر است، داده‌کاو از مدل «رگرسیون لجستیک» (Logistic Regression) استفاده می‌کند.

چگونه می‌توان مدل را ارزیابی کرد؟

در اینجا از یک سری از سنجه‌های ارزیابی مدل از جمله «منحنی مشخصه عملکرد سیستم» (Receiver Operating Characteristic | ROC)، «ناحیه زیر نمودار» (Area Under the Curve | AUC)، «حساسیت» (Sensitivity) و «ویژگی» (Specificity) و سنجه‌های مرتبط با کسب‌و‌کار (صرفه‌جویی در هزینه‌ها) استفاده می‌شود.

رگرسیون لجستیک

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

این مدل عالی است به این دلیل که «تفسیر» آن نسبت به بسیاری از دیگر مدل‌ها مانند«جنگل تصادفی» (Random Forest) ساده‌تر خواهد بود. منظور از تفسیر، آن است که می‌توان به سادگی رابطه بین ویژگی‌ها و خروجی را دید. ویژگی منفی رگرسیون لجستیک، دارا بودن «سوگیری» (Bias | بایاس) به سمت برازش‌های خطی است. اگر مرزهای تصمیم خطی نباشند، عملکرد این روش ممکن است به خوبی جنگل تصادفی نباشد. اساسا، باید موازنه‌ای بین تفسییرپذیری و انعطاف‌پذیری مدل وجود داشته باشد. این موضوع همیشه هنگام پیاده‌سازی مدل‌های یادگیری ماشین در نظر گرفته می‌شود.

آماده‌سازی داده‌ها

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

  • ایمپورت کردن داده‌ها
  • نگاه کلی به آن‌ها
  • پاکسازی داده‌ها
  • بخش‌بندی داده‌ها

۱. ایمپورت کردن داده‌ها

کار با ایمپورت کردن داده‌ها (+) آغاز می‌شود. در اینجا از کتابخانه Tidyverse استفاده خواهد شد. این کتابخانه از جمله مواردی است که دانشمندان داده‌ای که با R کار می‌کنند باید با آن آشنا باشند.

در قطعه کد بالا، «مسیر» (PATH) در آغاز کار روی دایرکتوری سیستم کاربر تنظیم شده. نکته‌ای که باید به آن توجه کرد آن است که متغیر path_loc را باید به دایرکتوری در حال کار، یعنی جایی که کد و مجموعه داده قرار می‌گیرند تغییر داد. از آنجا که این یک فایل CSV است، تابع read_csv برای خواندن داده‌ها در یک دیتافریم df مورد استفاده قرار گرفته.

۲. نگاه کلی به داده‌ها

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

می‌توان مشاهده کرد که ۲۱ ویژگی و ۷۰۴۳ سطر وجود دارد. ویژگی‌های متنوعی مانند TotalCharges و tenure موجود هستند. خروجی که مقرر شده پیش‌بینی شود، «churn» (رویگردانی) است. در این راستا، دیگر تابعی که مورد استفاده قرار می‌گیرد glimpse است که امکان بررسی سریع ویژگی‌ها را همراه با جزئیات بیشتر می‌دهد.

۳. پاک‌سازی داده‌ها

پیش از آنکه از مدل رگرسیون لجستیک استفاده شود، نیاز به انجام پاک‌سازی‌های کوچکی است. این کار با تغییر دادن متغیرهای «کاراکتر» (character) به «فاکتور» (factor) آغاز می‌شود.

در این کد از تابع mutate_if بسته dplyr (+) برای تغییر متغیر کاراکترها به نوع فاکتورها استفاده می‌شود. %>% تحت عنوان متغیر پایپ شناخته شده است. این متغیر از کتابخانه magrittr (+) می‌آید که بخشی از Tidyverse محسوب می‌شود. ایده اصلی این عملگر آن است که کد را خواناتر کند. اکنون می‌توان متغیر SeniorCitizen را از «صحیح» (integer) به «فاکتور» (factor) تغییر داد.

سپس، «مقادیر ناموجود» (missing values) مورد بررسی قرار می‌گیرند. این کار با تابع map از کتابخانه purrr (+) انجام می‌شود. purrr نیز یکی از کتابخانه‌های مجموعه بسته‌های Tidyverse است.

می‌توان مشاهده کرد که TotalCharges به تعداد ۱۱ مقدار ناموجود دارد. برای جایگزینی این مقادیر ناموجود، می‌توان آن‌ها را با «میانه» (median) جایگزین کرد.

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

۴. بخش‌بندی داده‌ها

برای حصول اطمینان از اینکه مدل دچار بیش‌برازش نمی‌شود، داده‌ها به دسته‌های «تست» (Test) و «آموزش» (Train) تقسیم می‌شوند. به این کار «اعتبارسنجی متقابل» (Cross Validation) گفته می‌شود. مدل روی یک مجموعه آموزش تحت آموزش قرار می‌گیرد و سپس کارایی آن با استفاده از مجموعه تست ارزیابی می‌شود. به طور تصادفی ٪۷۵ از داده‌ها برای مجموعه داده آموزش انتخاب می‌شوند و ٪۲۵ داده‌ها برای تست خواهند بود. آزمودن نسبت درصدهای گوناگون برای مقایسه نتایج، به علاقمندان توصیه می‌شود (مثلا نسبت ٪۸۰ به ٪۲۰ و ٪۶۰ به ٪۴۰ برای مجموعه‌های آموزش و تست). برای تقسیم داده‌ها، از بسته Caret (+) استفاده می‌شود. اکنون کار با ایمپورت کردن Caret آغاز و یک seed تنظیم می‌شود تا قابلیت تولید مجدد نتایج مورد بررسی قرار بگیرد.

سپس، از تابع createDataPartition برای انتخاب ٪۷۵ از داده‌ها برای استفاده در مجموعه آموزش استفاده می‌شود. این امر منجر به انتخاب یک نمونه تصادفی از ٪۷۵ سطرها می‌شود.

در نهایت، دیتافریم‌های آموزش و تست با استفاده از نمونه سطرها از بالا ساخته می‌شوند.

روش‌های دیگری مانند «اعتبارسنجی متقابل K-fold» وجود دارد. برای کسب اطلاعات بیشتر پیرامون چگونگی پیاده‌سازی k-fold در Caret، کافی است دستور (”help(“createFolds در کنسول R وارد شود.

برازش مدل

اکنون که مدل به دو بخش داده‌های تست و آموزش تقسیم بندی شد، زمان برازش مدل فرا رسیده است. برای پیاده‌سازی رگرسیون لجستیک، از تابع glm مربوط به «مدل‌های خطی عمومی شده» (Generalized Linear Models | GLM) استفاده می‌شود. انواع متفاوتی از GLM‌ها وجود دارند که رگرسیون لجستیک نیز از این جمله است. برای تعیین اینکه قصد اجرای رگرسیون لجستیک دودویی وجود دارد، از آرگومان family=binomial استفاده می‌شود. در ادامه کد کامل برازش مدل رگرسیون لجستیک آورده شده است.

در بخش بعدی، پیش‌بینی انجام و مدل ارزیابی می‌شود.

انجام پیش‌بینی

اکنون که مدل برازش شد، زمان بررسی چگونگی عملکرد آن فرا رسیده است. برای انجام این کار، پیش‌بینی‌ها با استفاده از مجموعه داده test انجام می‌شوند. این مجموعه داده به مدل fit از بخش قبل پاس داده می‌شود. برای پیش‌بینی احتمال‌ها ”type=”response تعیین می‌شود.

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

با توجه به نتایج، می‌توان مشاهده کرد که Yes با استفاده از ۱ رمزنگاری شده. حالا که رمزنگاری پاسخ مشخص است، می‌توان نتایج پیش‌بینی شده را به پاسخ‌های Yes و No تبدیل کرد. آستانه پاسخ روی 0.5 تنظیم می‌شود، بنابراین، اگر یک احتمال پیش‌بینی شده بالاتر از ۰.۵ باشد، می‌توان پاسخ را به Yes تبدیل کرد. گام نهایی، تبدیل کردن پاسخ‌های کاراکتری به «انواع فاکتور» (Factor Types) است. بدین ترتیب، رمزنگاری برای مدل رگرسیون لجستیک صحیح است.

توسط | ۱۳۹۷/۱۰/۵ ۱۲:۳۰:۴۵ آذر ۷ام, ۱۳۹۷|علم داده, کاربردها, مقالات|