۱. خلاصه

برندهای مصرفی اغلب تخفیف های خود را برای جذب مشتریان جدید ارائه می‌دهند. مشتریان وفادار کسانی هستند که پس از اولین خرید، باز هم از این برند خرید می‌کنند. با داشتن تاریخچه کافی از خریدها، پیش‌بینی این که کدام خریداران بادریافت پیشنهاد تخفیف ویژه، خرید خواهند کرد کار چندان پیچیده‌ای نیست؛ اما پیداکردن مشتری‌هایی که بعد از اولین خرید با تخفیف ویژه تبدیل به مشتری وفادار خواهندشد، چالش برانگیز است. پروژه پیدا کردن مشتریان وفادار از شما می‌خواهد تا خریدارانی که احتمالا باز هم از یک جنس خرید خواهند کردرا پیش‌بینی کنید. برای این کار مجموعه‌ای از پیشنهادهای شگفت‌انگیز تخفیف و سابقه
تراکنش‌های خرید خریداران قبل و بعد از این پیشنهادات را در اختیار دارید.

۲. مقدمه:

وفاداری مشتری یکی از کلیدی‌ترین عوامل تعیین کننده‌ی سودآوری یک شرکت است. وفاداری به یک چیز با تمایلات مطلوب نسبت به آن نشان داده می‌شود. حال این تمایل می‌تواند ناشی از رفتار یا نگرش فرد باشد.
تمایل رفتاری به معنای خرید کردن یا استفاده کردن زیاد یا همیشگی از یک محصول یا خدمت یک برند است. حال آنکه تمایل نگرشی(عاطفی) به معنای داشتن احساس تعلّق بیشتر به یک برند نسبت به دیگران است. این دو تمایل لزوماً به یکدیگر وابستگی کامل ندارند.
وفاداری مشتری تنها مربوط به فروشگاه‌ها نمی‌شود. صنایع زیادی مثل: صنایع الکترونیک, بیمه, اپراتورهای تلفن همراه, ارائه دهندگان خدمات اتصال به اینترنت, بانک‌ها و ... با این مسئله درگیر اند. در تمام این صنایع رویگردانی مشتریان یکی از مهمترین و پرهزینه‌ترین معضلات است.
برای مثال نرخ رویگردانی سالانه در صنعت Telecom در ایالات متّحده 1.9 درصد[1] و نرخ رویگردانی سالانه در صنعت SaaS بین 5 تا 7درصد است[2].
در نمودار زیر خلاصه‌ای از نرخ رویگردانی در صنایع مختلف آورده شده است[3]:

نرخ رویگردانی در صنایع مختلف

یکی از راه‌های کاهش نرخ رویگردانی این است که پیش‌بینی کنیم که چه مشتریانی رویگردانی خواهند کرد و سپس به صورت هدفدار آنهارا به استفاده‌ی مجدد از خدمات یا محصولات و ماندن در گروه مشتریان ترغیب کنیم.
مجموع زیان ناشی از رویگردانی مشتری 1.6 تریلیون دلار برآورد می‌شود[4]. این در حالی است که تنها با 5 درصد افزایش در نرخ بازگشت مشتری, می‌توان سودآوری‌را تا 95درصد افزایش داد. همچنین هزینه‌ی لازم برای به دست آوردن مشتری جدید25 برابر هزینه‌ی موردنیاز برای افزایش وفاداری مشتری و بازگردانی مجدد آن است[5].
ما برای نمایش بهتر تفکر و وضعیت مشتری, آن‌ها را به سه بخش: وفادار, ناامید و رویگردانده تقسیم می‌کنیم. تشخیص اینکه چه مشتری‌ای می‌خواهد رویگردانی کند و هدفگیری درست آن از چالش‌های پیش‌روی صنعت است. امّا تشخیص مشتری‌ای که می‌تواند به مشتری وفادار تبدیل شود, آن هم پیش از اینکه اوّلین خریدرا انجام دهد, کاری چالش برانگیزتر است.
با این حال ما تنها در این مسئله ما قصدداریم با داشتن تاریخچه‌ی کامل سبدخرید قبل از پیشنهاد, پیش‌بینی کنیم که کدام خریداران با احتمال بیشتری دوباره خرید خواهند کرد و به مشتریان وفادار ما تبدیل می‌شوند.

سه مجموعه داده‌ی دراختیار قرارگرفته برای این مسئله در تصاویر زیر آورده شده‌اند[6]:


۳. کارهای مرتبط:

در ابتدا باید با مهندسی ویژگی‌ها مشخص کنیم که مهم‌ترین ویژگی‌ها کدام‌اند تا بتوانیم با استفاده از آنها, مدل‌های مناسب‌را بسازیم. این کار نه تنها میزان درستی نتایج‌را بهبود می‌بخشد, بلکه با کاهش تعداد ویژگی‌هایی که مدنظر قرار می‌گیرند, سرعت کاررا هم افزایش می‌دهد. برای اینکار 56 ویژگی زیررا در نظر می‌گیریم[6]:

جدول ویژگی‌ها

در جدول زیر شرح کلی ویژگی‌ها آورده شده است:

شرح کلّی ویژگی‌ها

برای انتخاب ویژگی, از شیوه‌ی random forest استفاده شده است. در این شیوه به خاطر استراتژی‌های مبتنی بر درختی که استفاده می‌شود, ویژگی‌ها براساس اینکه چقدر خلوص گره‌را افزایش می‌دهند رتبه بندی می‌شوند. گره‌هایی که بیشترین کاهش میزان ناخالصی‌را دارند در ابتدا, و گره‌هایی که کمترین میزان کاهش‌را داشته‌اند در انتهای درخت قرار می‌گیرند. در اینجا هر ویژگی یک گره محسوب شده است.
با حرص کردن درخت حاصل شده از یک گره به خصوص به بعد, می‌توان مهمترین گره(ویژگی)هارا به دست آورد. با استفاده از این شیوه, بیست ویژگی زیر به عنوان مهمترین ویژگی‌ها شناخته می‌شوند:

بیست ویژگی اثرگذار و مهم

متدولوژی به کار رفته در یک نگاه به صورت زیر است:

متدولوژی به کار رفته

یکی از راه‌های کاهش تعداد transactions حذف کردن سطرهایی است که category id و company id ندارند. با این کار تعداد سطور از حدود 350 میلیون سطر به 27 میلیون کاهش می‌یابد[7].

برروی این مجموعه داده 7 الگوریتم: RF, GBM, neuralnet, glmnet, dlearning, xgb و logistic اجرا شده‌اند که نتایج RUC CURVE آنها در نمودار
زیر آورده شده است[6].

نتایج RUC CURVE

سپس چهار الگوریتم RF, GBM, neuralnet و glmnet برای بهبودبخشیدن به کارایی و زمان محاسبه انتخاب شده‌اند. نتایج حاصله در جدول
زیر نمایش داده شده‌اند[6]:

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

همچنین در پیاده سازی دیگر با استفاده از 3 متد GBM, Random Forest و GLM نتایج زیر حاصل شده است[8]:
نتایج نهایی سه الگوریتم منتخب روش دوم

۴. مجموعه داده

همانطور که در بخش کارهای مرتبط نشان داده شد, داده‌های مسابقه در سه فایل اصلی transactions, trainHistory و offers قرار دارند که شرح متغیرهای آن‌ها آورده شده است. به علاوه فایل‌ testHistory برای تست و یادگیری هم در مجموعه‌داده قرار دارد.
برای آگاهی بیشتر نسبت به هر کدام از این فایل‌ها شرح مختصری در زیر آورده شده است:
1- فایل transactions: در این فایل اطلاعات هر تراکنشی که هر مشتری در بازه‌ی زمانی حداقل یک سال پس از دریافت پیشنهاد انجام داده است آورده شده.
هر تراکنش شامل اطلاعات شعبه‌ی فروشگاه, گروه‌بندی جامع از دسته‌ها, دسته‌ی محصول, کمپانی تولید کننده‌ی محصول, برند محصول, تاریخ خرید, مقدارر محصولات خریداری شده(دو کیلوگرم محصول, سه لیتر محصول و ...), واحد اندازه‌گیری محصول(کیلوگرم, اونس, لیتر و ...), تعداد واحدهای خریداری شده از محصول و مقدار پرداخت به دلار.
2- فایل traintHistory: این فایل شامل پیشنهاد مشوق به هر مشتری و بازخورد رفتاری او نسبت به آن پیشنهاد است. برای هر پیشنهاد این اطلاعات نگهداری می‌شوند:شعبه‌ی فروشگاه, شناساگر پیشنهاد مشوق, شناساگر فروشگاه فیزیکی, تعداد دفعاتی که مشتری خرید تکراری داشته است, مشتری پیش از این خرید تکراری داشته است یا نه(مقداری boolean است) و تاریخ دریافت پیشنهاد توسط مشتری.
3- فایل offers:در این فایل اطلاعات مربوط به هر پیشنهاد نگهداری می‌شود. این فایل شامل اطلاعات زیر است:
دسته‌ی محصول, تعداد واحدهایی که باید خریداری شود تا پیشنهاد به مشتری تعلق بگیرید, کمپانی سازنده‌ی محصول, ارزش دلاری پیشنهاد , برند محصول

۵. پیاده‌سازی

برای انجام پیاده‌سازی, ابتدا ما باید حجم داده‌هارا کاهش داد.سپس باید معیارهای موردنیاز را انتخاب کرد و سپس برای هر معیار اطلاعات مرتبط‌را از مجموعه داده استخراج کرد. سپس باید به طبقه بندی و ادغام نتایج پرداخت. در ادامه هر بخش توضیح داده خواهد شد.

۵.۱. کاهش داده

حجم داده‌های فایل transactions بسیار بالااست. این داده بالغ‌بر 350 میلیون سطر دارد و حجم آن بیش از 22 گیگابایت است.کار با این حجم بسیار مشکل و زمانبر است. به همین دلیل ما باید به شیوه‌ای داده‌هایی‌را که تأثیری در نتیجه‌ی نهایی ندارند از آن حذف کنیم.
برای این کار ما رویکرد به نسبت ساده‌ای‌را برمی‌گزینیم. در این رویکرد تراکنش‌هایی‌را که پیشنهاد مربوط آن‌ها دارای نوع محصول یا نام کمپانی نیست حذف می‌کنیم. نحوه‌ی انجام این کار با ادغام اطلاعات transactions و offers در فایل dataReduction.py مشخص است.
با انجام این کار حجم فایل نهایی از 22 گیگابایت به 1.7 گیگابایت و تعداد سطرها از 350 میلیون به 27 میلیون کاهش می‌یابد.

۵.۲. انتخاب معیارها

برای این رقابت معیارهای زیر انتخاب شده‌اند:

  1. تعداد دفعاتی که مشتری از یک کمپانی یک محصول‌را با پیشنهاد مشوق خریده است(has_bought_company)

  2. تعداد خریدها(`has_bought_company_q)

  3. مجموع مقدار پرداخت شده برای یک کمپانی در یک پیشنهاد(`has_bought_company_a)

  4. روزهای بین آخرین خرید و تاریخ پیشنهاد

  5. هرگز از یک کمپانی یک محصول‌را با پیشنهاد مشوق خریداری نکرده است(`has_not_bought_company)

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

  7. خرید از یک برند خاص(تمامی موارد 1 تا 5ا. تنها تفاوت این است که به جای کمپانی معیارها برای برند درنظرگرفته شده‌اند.)

  8. مشتری از برند, کمپانی و دسته پیش از این خرید کرده است.

  9. مشتری از برند, کمپانی و دسته پیش از این خرید نکرده است.(`has_not_bought_brand_company)

  10. مجموع پرداختی خریدار

  11. سهم بازار هر محصول در هر دسته

  12. سهم مشتریانی که یک محصول‌را خریداری کرده‌اند

  13. سهم مشتریانی که از یک بخش خرید کرده‌اند

  14. قیمت میانگین محصول

  15. تفاوت‌های فصلی در پرداخت برای هر محصول

  16. احتمال خرید مجدد عمومی برای هر محصول باتوجّه به خریدهای مجدد گذشته

  17. هر محصول با چقدر رقابت مواجه شده است.

  18. در مقایسه با محصولات دیگر, هر محصول چقدر ارزان است

  19. زمان گذشته از اولین تراکنش مشتری..
    ## طبقه بندی
    پس از انتخاب معیارها, طبقه‌بندی براساس آنها انجام می‌شود. طبقه‌بندی درمجموع ترکیبی از مدل‌های زیر است:
    1- طبقه‌بندی درخت‌های شدیداً تصادفی شده(Extra Trees Classifier)
    این مدل طبقه بندی که به عنوان Extremely randomized trees هم شناخته می‌شود, نوعی از Random Forest است که قبلاً توضیح داده شد. در این روش برخلاف random forst, در هر مرحله تمامی نمونه استفاده می‌شود و حدود تصمیم‌گیری به صورت رندم انتخاب می‌شوند.
    در نمونه‌های دنیای واقعی, کارآیی با random forst قابل مقایسه است و در برخی موارد از آن بهتر است.[9]
    برای این مدل از scikit-learn استفاده شده است.
    2-طبقه‌بندی تدریجی با استفاده از درخت به عنوان برآوردگرهای پایه(Gradient Boosting Classifier with Trees as base estimators):
    در این روش یک مدل پیش‌بینی به شکل یک گروه از مدل‌های پیش‌بینی ضعیف ساخته می‌شود. عموماُ این مدل‌ها به شکل درخت تصمیم هستند. این شیوه مدل‌را به صورت مرحله مرحله‌ای می‌سازد و سپس آنهارا تعمیم می‌دهد. این کار با بهینه‌سازی یک تابع از دست دهی تفاضلی انجام می‌شود.[10] [11]
    برای این مدل از xgboost استفاده شده است.
    3-طبقه‌بندی تدریجی با استفاده از مدل‌های خطی به عنوان برآوردگرهای پایه(Gradient Boosting Classifier with Linear models as base estimators):
    تنها تفاوت این شیوه با شیوه‌ی قبل در استفاده از مدل‌های خطی به جای درخت تصمیم است.
    4- پشتیبانی از ماشین‌های برداری متناسب سازی شده با کاهش تدریجی تصادفی و ساده‌سازی حلقه برای بهینه کردن منحنی ROC(SVM Classifier fitted with SGD and loop-sampling to optimize area under ROC curve ):
    این شیوه یک مدل تحت نظارت با الگوریتم‌های یادگیری وابسته است. در این شیوه یک مجموعه‌ی تمرینی از مثال‌ها داده می‌شود که مشخص شده است که هرکدام به کدام دسته مربوط می‌شوند.
    الگوریتم آموزش SVM مدلی ایجاد می‌کند که مثال‌های جدیدرا به یکی از دو دسته مربوط می‌کند.[12]
    برای این مدل از sofia-ml استفاده شده است.
    5-SVM Classifier fitted with SGD, fitted on power-transformed repeattrips (sofia-ml)
    6- مقسم پس‌رفت(Quantile regression):
    مقسک پس‌رفت یک گسترش برای پس‌رفت خطی است و هنگامی استفاده می‌شود که شرایط پس‌رفت خطی شدنی نیستند. ایده استفاده از یک شیب پس‌رفت متوسط است.[13]
    برای این مدل از vowpal wabbit استفاده شده است.
    لینک پیاده‌سازی در گیت هاب

۶. کارهای آینده

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

۷. منابع:

1- https://wp.nyu.edu/adityakapoor/2017/02/17/churn-in-the-telecom-industry-identifying-customers-likely-to-churn-and-how-to-retain-them/

2- http://sixteenventures.com/saas-churn-rate

3- https://info.recurly.com/research/churn-rate-benchmarks

4-https://blog.smile.io/essential-customer-loyalty-statistics-2017

5-https://www.visioncritical.com/customer-loyalty-stats/

6-http://matthewalanham.com/Students/2017_Jengwen-Shiva.pdf

7-https://mlwave.com/predicting-repeat-buyers-vowpal-wabbit/
8-https://github.com/ChenglongChen/Kaggle_Acquire_Valued_Shoppers_Challenge
9- Geurts, P. , Ernst, D. , &Wehenkel, L. (2006). Extremely randomized trees
10 - Friedman, J. H.(1999). Stochastic Gradient Boosting.
11 - Friedman, J. H.(1999). Greedy Function Approximation: A Gradient Boosting Machine.
12- Cortes, C. , &Vapnik, V. (1995). Support-vecotor networks
13 - Koenker, Roger (2005). Quantile Regression. Cambridge University Press. ISBN0-521-60827-9

تایید شده

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

محمد غضنفری

سلام
در ابتدا ممنونم از اینکه اکثر موارد مطرح شده در بازبینی قبلی را اصلاح کردید.
به چند نکته در مورد این فاز اشاره خواهم کرد:
1- اطلاعات مربوط به کاهش ابعاد را که در بخش 5.1 آورده اید باید از بخش کارهای مرتبط حذف می کردید. برخی از مطالب در متن شما دوبار تکرار شده است.
2- انتظار میرفت در کاهش ابعاد فقط به حذف مواردی که نوع محصول یا نام کمپانی ندارند اکتفا نکنید. روشهای علمی زیادی هست که به سادگی با توجه به میزان هم بستگی داده ها به یکدیگر ابعاد فضای حالت را کاهش میدهند.
3- در بخش طبقه بندی باید پس از معرفی طبقه بندهای مختلف (که البته می توانست بهتر صورت گیرد) بیان می کردید شما کدام طبقه بند را و به چه دلیلی انتخاب کرده اید.
4- من موفق نشدم پروژه شما را اجرا کنم. طبق مراحلی که در readme گفته بودید جلو رفتم ولی اجرا نمیشد. البته ممکن است مشکل پایتون سیستم من باشد. من چون پایتون را خیلی حرفه ای بلد نیستم نتوانستم مشکل را برطرف کنم. به هر حال طبق مراحل توضیحی شما اجرا نشد.
5- شما قرار بود در این فاز پیاده سازی داشته باشید و نتایج را گزارش کنید که این کار صورت نگرفته است.
امیدوارم در فاز آتی پیاده سازی داشته باشید.
موفق باشید