پیدا کردن مشتری‌های وفادار

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

# مقدمه:

وفاداری مشتری یکی از کلیدی‌ترین عوامل تعیین کننده‌ی سودآوری یک شرکت است. وفاداری به یک چیز با تمایلات مطلوب نسبت به آن نشان داده می‌شود. حال این تمایل می‌تواند ناشی از رفتار یا نگرش فرد باشد.
 تمایل رفتاری به معنای خرید کردن یا استفاده کردن زیاد یا همیشگی از یک محصول یا خدمت یک برند است. حال آنکه تمایل نگرشی(عاطفی) به معنای داشتن احساس تعلّق بیشتر به یک برند نسبت به دیگران است. این دو تمایل لزوماً به یکدیگر وابستگی کامل ندارند.
وفاداری مشتری تنها مربوط به فروشگاه‌ها نمی‌شود. صنایع زیادی مثل: صنایع الکترونیک, بیمه, اپراتورهای تلفن همراه, ارائه دهندگان خدمات اتصال به اینترنت, بانک‌ها و ... با این مسئله درگیر اند. در تمام این صنایع رویگردانی مشتریان یکی از مهمترین و پرهزینه‌ترین معضلات است.
برای مثال نرخ رویگردانی سالانه در صنعت Telecom در ایالات متّحده 1.9 درصد[1]  و نرخ رویگردانی سالانه در صنعت SaaS بین 5 تا 7درصد است[2].
در نمودار زیر خلاصه‌ای از نرخ رویگردانی در صنایع مختلف آورده شده است[3]:
![نرخ رویگردانی در صنایع مختلف](https://boute.s3.amazonaws.com/277-ai-first-pic.png)

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

سه مجموعه داده‌ی دراختیار قرارگرفته برای این مسئله در تصاویر زیر آورده شده‌اند[6]:
![](https://boute.s3.amazonaws.com/277-ai-second-pic.png)

![](https://boute.s3.amazonaws.com/277-ai-third-pic.png)
![](https://boute.s3.amazonaws.com/277-ai-4th-pic.png)

# کارهای مرتبط:

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

![جدول ویژگی‌ها](https://boute.s3.amazonaws.com/277-ai-5th-pic.png)

در جدول زیر شرح کلی ویژگی‌ها آورده شده است:
![شرح کلّی ویژگی‌ها](https://boute.s3.amazonaws.com/277-ai-6th-pic.png)


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

![بیست ویژگی اثرگذار و مهم](https://boute.s3.amazonaws.com/277-ai-7th-pic.png)

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

![متدولوژی به کار رفته](https://boute.s3.amazonaws.com/277-ai-8th-pic.png)

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

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

![نتایج RUC CURVE](https://boute.s3.amazonaws.com/277-ai-9th-pic.png)

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

![نتایج نهایی چهار الگوریتم منتخب](https://boute.s3.amazonaws.com/277-ai-10th-pic.png)
همچنین در پیاده سازی دیگر با استفاده از 3 متد GBM, Random Forest  و GLM نتایج زیر حاصل شده است[8]:
![نتایج نهایی سه الگوریتم منتخب روش دوم](https://boute.s3.amazonaws.com/277-ai-11th-pic.png)

# مجموعه داده
همانطور که در بخش کارهای مرتبط نشان داده شد, داده‌های مسابقه در سه فایل اصلی 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. زمان گذشته از اولین تراکنش مشتری.. 

## طبقه‌بندی

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

### طبقه‌بندی درخت‌های شدیداً تصادفی شده(Extra Trees Classifier)

این مدل طبقه بندی که به عنوان Extremely randomized trees هم شناخته می‌شود, نوعی از Random Forest است که قبلاً توضیح داده شد. در این روش برخلاف random forst, در هر مرحله تمامی نمونه استفاده می‌شود و حدود تصمیم‌گیری به صورت رندم انتخاب می‌شوند.
در نمونه‌های دنیای واقعی, کارآیی با random forst قابل مقایسه است و در برخی موارد از آن بهتر است.[9]
برای این مدل از scikit-learn استفاده شده است.

### طبقه‌بندی تدریجی با استفاده از درخت به عنوان برآوردگرهای پایه(Gradient Boosting Classifier with Trees as base estimators):

در این روش یک مدل پیش‌بینی به شکل یک گروه از مدل‌های پیش‌بینی ضعیف ساخته می‌شود. عموماُ این مدل‌ها به شکل درخت تصمیم هستند. این شیوه مدل‌را به صورت مرحله مرحله‌ای می‌سازد و سپس آنهارا تعمیم می‌دهد. این کار با بهینه‌سازی یک تابع از دست دهی تفاضلی انجام می‌شود.[10]  [11]
برای این مدل از xgboost استفاده شده است.

### طبقه‌بندی تدریجی با استفاده از مدل‌های خطی به عنوان برآوردگرهای پایه(Gradient Boosting Classifier with Linear models as base estimators):

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

### پشتیبانی از ماشین‌های برداری متناسب سازی شده با کاهش تدریجی تصادفی و ساده‌سازی حلقه برای بهینه کردن منحنی ROC(SVM Classifier fitted with SGD and loop-sampling to optimize area under ROC curve ):

این شیوه یک مدل تحت نظارت با الگوریتم‌های یادگیری وابسته است. در این شیوه یک مجموعه‌ی تمرینی از مثال‌ها داده می‌شود که مشخص شده است که هرکدام به کدام دسته مربوط می‌شوند. 
الگوریتم آموزش SVM مدلی ایجاد می‌کند که مثال‌های جدیدرا به یکی از دو دسته مربوط می‌کند.[12]
برای این مدل از sofia-ml استفاده شده است.

### SVM Classifier fitted with SGD, fitted on power-transformed repeattrips (sofia-ml)

### مقسم پس‌رفت(Quantile regression):

مقسم پس‌رفت یک گسترش برای پس‌رفت خطی است و هنگامی استفاده می‌شود که شرایط پس‌رفت خطی شدنی نیستند. ایده استفاده از یک شیب پس‌رفت متوسط است.[13]
برای این مدل از vowpal wabbit استفاده شده است.

## نتیجه
مساحت زیر منحنی عامل گیرنده‌ی مشخصات(receiver operating characteristic curve) در نهایت مقدار 0.60339 است. با توجّه به ن[تایج موجود در سایت kaggle](https://www.kaggle.com/c/acquire-valued-shoppers-challenge/leaderboard), نتیجه‌ی حاصل از این کد جزو ده درصد برتر است. 
# بهبود نتایج

## چالش‌های بهبود نتایج
همانطور که در بخش‌های پیش ذکر شد, مهم‌ترین بخش برای رسیدن به نتیجه‌ی بهتر مهندسی معیارهاست. هرچقدر معیارهای انتخابی ارتباط بیشتری با داده‌ها داشته باشند و دقّت آن‌ها بالاتر باشد, نتیجه‌ی حاصله بهتر خواهد بود.
چالش اصلی در اینجا این است که معیارها کاملاً به داده‌های ورودی وابسته‌اند. یعنی ممکن است با مجموعه داده‌ی دیگری, معیارهای انتخابی در این راه حل نتیجه‌ی بهتر یا بدتری داشته باشند.
از طرفی شیوه‌های بررسی میزان ارتباط داده‌ها که در بخش بعدی به آن‌ها می‌پردازیم دارای خطا هستند. این مشکلات باعث می‌شوند که برای پیداکردن معیارهای بهتر مجبور شویم بارها دست به آزمایش بزنیم که با توجّه به حجم داده‌ها و میزان بالای پردازش کاری سخت و بسیار زمان‌بر است.
به همین دلیل متأسفانه در شرایط این ترم امکان انجام آزمایش‌های بیشتر محقق نشد. با این وجود در بخش بعدی گام‌های لازم برای بهبود نتایج‌را بررسی می‌کنیم.

## تغییر شیوه‌ی کاهش حجم داده
همانطور که در بخش قبلی گفته شد میزان کارایی معیارها کاملاً به داده‌های وروی وابسته‌اند. این به این معناست که اگر این معیارها روی داده‌های اصلی آزمایش می‌شدند به نتیجه‌ی متفاوتی می‌رسیدند. انتظار می‌رود که اگر داده‌هارا باتوجّه به میزان همبستگی آن‌ها کاهش بدهیم نتایج نهایی بهبود یابند.
برای مثال در تصویر زیر تعداد تکرارها بر اساس پیشنهاد به تصویر کشیده شده است:
![پراکندگی خریدهای تکراری نسب به پیشنهاد](https://boute.s3.amazonaws.com/277-Screenshot_1.jpg)
با حذف 154 ردیف از مجموعه داده‌ی history که تعداد تکرار بیشتر از 20 دارند به نمودار پراکندگی زیر می‌رسیم:
![پراکندگی هرس شده‌ی خریدهای تکراری نسبت به پیشنهاد](https://boute.s3.amazonaws.com/277-Screenshot_2.jpg)
دلیل حذف آن ردیف‌ها این است که میانه‌ی خریدهای تکراری 1و میانگین تعداد خریدهای تکراری 2.418 است[14].
با ادامه دادن این شیوه یا شیوه‌های مشابه می‌توان به مجموعه‌داده‌ای با همبستگی بیشتر رسید. همچنین می‌توان این روش‌را به صورت ترکیبی با روشی که ما در این پیاده‌سازی استفاده کردیم به کار برد.

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

# کارهای آینده
مسئله‌ی ریزش مشتری و عدم وفاداری آن‌ها امروزه به یکی از دغدغه‌های بزرگ کسب و کارها تبدیل شده است. به طوری که آن‌ها سالانه بخش بزرگی از درآمد خودرا صرف پیداکردن راهی برای رهایی از این مشکل می‌کنند. 
در این نوشته سعی شد که به شیوه‌ای برای حل کردن این مشکل پرداخته شود. لازم است در ادامه بررسی شود که چه راه‌های بهتری برای کاهش حجم داه‌ها و حذف داده‌های نامربوط وجود دارد؟ باجایگزینی کدام معیارها می‌توان با توان پردازشی برابر به نتیجه‌ی بهتری رسید و یا بدون آسیب زیاد به نتیجه زمان و منابع مورد نیاز را به مقدار قابل قبولی کاهش داد؟ آیا می‌توان از روش‌های آماری دیگری هم در کنار این روش‌ها برای بهبود نتایج استفاده کرد؟ از آنجایی که معیارها به داده‌ها وابسته‌اند, چگونه می‌توان معیارهای مناسب‌را با سرعت بیشتری به دست آورد تا این بخش از کار تأثیر سوء کمتری بر تمام کار بگذارد؟


[**لینک پیاده‌سازی در گیت هاب**](https://github.com/alihoseiny/IUST-Kaggle)


# منابع:

1- [https://wp.nyu.edu/adityakapoor/2017/02/17/churn-in-the-telecom-industry-identifying-customers-likely-to-churn-and-how-to-retain-them/](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](http://sixteenventures.com/saas-churn-rate)

3- [https://info.recurly.com/research/churn-rate-benchmarks](https://info.recurly.com/research/churn-rate-benchmarks)

4-[https://blog.smile.io/essential-customer-loyalty-statistics-2017](https://blog.smile.io/essential-customer-loyalty-statistics-2017)

5-[https://www.visioncritical.com/customer-loyalty-stats/](https://www.visioncritical.com/customer-loyalty-stats/)

6-[http://matthewalanham.com/Students/2017_Jengwen-Shiva.pdf](http://matthewalanham.com/Students/2017_Jengwen-Shiva.pdf)

7-[https://mlwave.com/predicting-repeat-buyers-vowpal-wabbit/](https://mlwave.com/predicting-repeat-buyers-vowpal-wabbit/)
8-[https://github.com/ChenglongChen/Kaggle_Acquire_Valued_Shoppers_Challenge](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
14 - [http://rstudio-pubs-static.s3.amazonaws.com/287639_1464e0114664470e82b91d1cd09d01bb.html](http://rstudio-pubs-static.s3.amazonaws.com/287639_1464e0114664470e82b91d1cd09d01bb.html)