پیش بینی churn یا تحلیل ریزش مشتریان در پایتون
پایتون یکی از پرکاربردترین زبانهای برنامهنویسی برای تجزیهوتحلیل دادههای مالی است که دارای کتابخانههای مفید و عملکرد داخلی فراوانی است. در این مقاله آموزشی از مکتب خونه میخواهیم از کتابخانههای یادگیری ماشین پایتون برای پیش بینی churn یا پیش بینی ریزش مشتری استفاده کنیم. زمانی است که یک مشتری، کاربر، مشترک یا هر نوع مشتری بازگشتی فعالیت تجاری خود را با شرکت ما متوقف میکند یا به رابطه با یک شرکت پایان میدهد، اصطلاحاً به آن ریزش مشتری میگوییم.
[box type=”note” align=”” class=”” width=””]ویدئو پیشنهادی: آموزش هوش مصنوعی[/box]
ریزش مشتری
ریزش مشتری یک اصطلاح مالی است که به از دست دادن مشتری یا کاربران اشاره دارد؛ یعنی زمانی که مشتری از تعامل با یک شرکت یا کسبوکار خودداری میکند. بهطور مشابه، نرخ ریزش نرخی است که در آن مشتریان یا مشتریان یک شرکت را در یک دوره زمانی خاص ترک میکنند. نرخ ریزش بالاتر از یک آستانه معین میتواند تأثیرات ملموس و نامشهود بر موفقیت تجاری یک شرکت داشته باشد. در حالت ایده آل، شرکتها دوست دارند تا جایی که میتوانند مشتریان خود را حفظ کنند. از این رو بسیاری از شرکتها از پیش بینی churn برای تحلیل مشتریان خودشان استفاده میکنند.
با ظهور علم دادههای پیشرفته و تکنیکهای یادگیری ماشین، اکنون این امکان برای شرکتها وجود دارد که مشتریان بالقوهای را که ممکن است در آینده نزدیک تعامل با کسبوکار آنها را متوقف کنند، شناسایی کنند. در این مقاله که برای مشتریان یک بانک نوشتهایم، خواهید دید که چگونه یک بانک میتواند ریزش مشتری را بر اساس ویژگیهای مختلف مشتری مانند سن، جنسیت، جغرافیا و موارد دیگر پیش بینی کند. جزئیات ویژگیهای مورداستفاده برای پیش بینی ریزش مشتری با پایتون در بخش بعدی ارائهشده است.
استفاده از پایتون برای پیش بینی churn
پایتون با مجموعهای از کتابخانههای علم داده و یادگیری ماشین عرضه میشود که میتوان از آنها برای پیشبینی بر اساس ویژگیها یا ویژگیهای مختلف یک مجموعه داده استفاده کرد. کتابخانه SCIKIT-LEARN پایتون یکی از این ابزارهاست. ما در این آموزش از این کتابخانه برای پیشبینی ریزش مشتری استفاده میکنیم.
مجموعه داده: مدلسازی ریزش مشتریان بانک
مجموعه دادهای که برای توسعه یک مدل پیش بینی ریزش مشتری ما در این آموزش استفاده میکنیم را میتوانید از لینک زیر KAGGLE دانلود کنید. حتماً فایل فشرده را استخراجکنید و فایل CSV را در هارددیسک خود ذخیره کنید.
لینک دانلود مجموعه دیتاست برای پیش بینی ریزش مشتری:
https://www.kaggle.com/barelydedicated/bank-customer-churn-modeling/version/1
با باز کردن فایل مدنظر، میبینیم که مجموعه داده شامل 14 ستون است (همچنین بهعنوان ویژگی یا متغیر شناخته میشود). 13 ستون اول متغیر مستقل هستند، درحالیکه ستون آخر، متغیر وابسته است که دارای مقدار باینری 1 یا 0 است.
در اینجا، 1 به حالتی اشاره دارد که مشتری پس از 6 ماه بانک را ترک کرده است و 0 موردی است که در آن بانک را ترک کرده است. مشتری بعد از 6 ماه بانک را ترک نکرده است. این بهعنوان یک مشکل طبقهبندی باینری شناخته میشود که در آن شما فقط دو مقدار ممکن برای متغیر وابسته دارید. در این مورد، مشتری یا پس از ۶ ماه بانک را ترک میکند یا نمیکند.
ذکر این نکته حائز اهمیت است که دادههای متغیرهای مستقل 6 ماه قبل از دادههای متغیر وابسته جمعآوریشده است، زیرا وظیفه توسعه یک مدل یادگیری ماشینی است که میتواند پیشبینی کند که آیا مشتری پس از 6 ماه بانک را ترک میکند یا خیر. برای حل این مشکل میتوانید از الگوریتمهای طبقهبندی MACHINE LEARNING استفاده کنید.
توجه: تمامی کدهای این مقاله با استفاده از محیط برنامهنویسی SPYDER اجراشده است. شما میتوانید از سایر محیطهای برنامهنویسی پایتون نیز برای انجام این کار استفاده کنید.
[box type=”note” align=”” class=”” width=””]مقاله پیشنهادی: نرمافزار هوش مصنوعی چیست؟ [/box]
مراحل انجام پیش بینی ریزش مشتری با استفاده از پایتون
در اینجا مروری بر مراحلی است که در این مقاله انجام خواهیم داد:
- ایمپورت کردن کتابخانهها
- حال بارگیری مجموعه داده
- انتخاب ویژگیهای مرتبط
- تبدیل ستونهای طبقهبندیشده به عددی
- پیشپردازش دادهها
- آموزش الگوریتم یادگیری ماشین
- ارزیابی الگوریتم یادگیری ماشین
- ارزیابی ویژگیهای مجموعه داده
ما این مراحل پیش بینی churn را بهصورت قدمبهقدم با همدیگر پیادهسازی میکنیم.
مرحله 1: واردکردن کتابخانهها برای پیش بینی churn در پایتون
اولین قدم، مثل همیشه، واردکردن کتابخانههای موردنیاز است. برای این کار کد زیر را اجرا میکنیم. ممکن است که کتابخانهها از پیش نصب نشده باشند و خطای عدم نصب کتابخانهها را بدهد، در این صورت در کنسول اسپایدر یا در کنسول پایتون با دستور pip آنها را رسم میکنیم.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
به فرض مثال اگر کتابخانه pandas از قبل نصب نشده باشد، ما با استفاده از دستور:
Pip install pandas
آن را نصب میکنیم. برای سایر کتابخانههای دیگر نیز روال به همین صورت است.
مرحله 2: بارگذاری مجموعه داده
مرحله دوم این است که مجموعه داده را از فایل CSV محلی در برنامه پایتون بارگیری کنیم. بیایید از روش read_csv کتابخانه pandas استفاده کنیم. کد زیر را اجرا کنید:
customer_data = pd.read_csv(r'C:/Users/user/Dropbox/PC/Desktop/churn/Churn_Modelling.csv')
اگر دیتا فریم customer_data را در پنجره Spyder Variable Explorer بازکنید، باید ستونها را مانند شکل زیر ببینید:
ما در این آموزش پوشهای را به نام churn ساختهایم که فایل حاوی دیتاست و فایل کد ما است.
مرحله 3: انتخاب ویژگی برای پیش بینی churn
بهعنوان یادآوری، درمجموع 14 ستون درمجموع داده ما وجود دارد (تصویر بالا را ببینید). با اجرای کد زیر میتوانید این موضوع را تأیید کنیم:
columns = customer_data.columns.values.tolist()
print(columns)
در خروجی باید لیست زیر را مشاهده کنید:
همه ستونها بر ریزش مشتری تأثیر نمیگذارند بنابراین در پیش بینی churn زیاد تأثیرگذار نیستند: بیایید در رابطه با هر ستون را یکییکی بحث کنیم:
- RowNumber – مربوط به شماره رکورد (ردیف) است و تأثیری بر خروجی ندارد. این ستون حذف خواهد شد.
- CustomerId – حاوی مقادیر تصادفی است و تأثیری بر خروج مشتری از بانک ندارد. این ستون حذف خواهد شد.
- Surname- نام خانوادگی مشتری بر تصمیم او برای ترک بانک تأثیری ندارد. این ستون نیز حذف خواهد شد.
- CreditScore – میتواند بر روی ریزش مشتری تأثیر بگذارد، زیرا مشتری با امتیاز اعتباری بالاتر کمتر بانک را ترک میکند.
- Geography- موقعیت یک مشتری میتواند بر تصمیم او برای ترک بانک تأثیر بگذارد. ما این ستون را حفظ خواهیم کرد.
- Gender- جنسیت در خروج مشتری از بانک نقش دارد یا خیر؟ ما این ستون را نیز درج خواهیم کرد تا ببینیم چه اتفاقی برای آن خواهد افتاد.
- Age – این ویژگی مطمئناً با ریزش مشتری مرتبط است، زیرا مشتریان مسنتر کمتر از افراد جوانتر بانک خود را ترک یا عوض میکنند.
- Tenure- به تعداد سالهایی اشاره دارد که مشتری بانک بوده است. بهطورمعمول، مشتریان مسنتر وفادارتر هستند و کمتر بانک را ترک میکنند.
- Balance- همچنین یک شاخص بسیار خوب از ریزش مشتری است، زیرا افرادی که موجودی بیشتری در حسابهای خود دارند، در مقایسه با افرادی که موجودی کمتری دارند، کمتر بانک را ترک میکنند.
- NumOfProducts – به تعداد محصولاتی که مشتری از طریق بانک خریداری کرده است اشاره دارد.
- HasCrCard – نشان میدهد که آیا مشتری کارت اعتباری دارد یا خیر. این ستون نیز مرتبط است، زیرا افرادی که کارت اعتباری دارند کمتر بانک را ترک میکنند.
- IsActiveMember—مشتریان فعال کمتر بانک را ترک میکنند، بنابراین ما این را حفظ میکنیم.
- EstimatedSalary- مانند موجودی، افرادی که حقوق کمتری دارند در مقایسه با افرادی که حقوق بالاتری دارند، احتمال بیشتری دارد بانک را ترک کنند.
- Exited- خواه مشتری بانک را ترک کند یا نه ما باید این ویژگی را در پیش بینی churn لحاظ کنیم.
پس از مشاهده دقیق ویژگیها، ستونهای RowNumber، CustomerId و Surname را از مجموعه ویژگیهای خود حذف میکنیم. تمام ستونهای باقیمانده به یک شکل به ریزش مشتری کمک میکنند. برای نادیده گیری این سه ستون، کد زیر را اجرا کنید:
dataset = customer_data.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1)
در اینجا توجه کنید که ما دادههای فیلتر شده خود را در یک قاب داده جدید به نام مجموعه داده ذخیره کردهایم. چارچوب دادههای customer_data همچنان شامل تمام ستونها است. بعداً دوباره از آن استفاده خواهیم کرد.
مرحله 4: تبدیل ستونهای دستهبندی به ستونهای عددی
الگوریتمهای یادگیری ماشینی با دادههای عددی کارایی بسیار بهتری را ارائه میدهند. درمجموع داده ما، دو ستون دستهبندی داریم: جغرافیا (‘Geography’) و جنسیت (‘Gender’). این دو ستون حاوی دادهها در قالب متنی هستند. باید آنها را به ستونهای عددی تبدیل کنیم.
اجازه دهید ابتدا این دو ستون را از مجموعه داده خود جدا کنیم. برای این کار کد زیر را اجرا میکنیم:
dataset = dataset.drop(['Geography', 'Gender'], axis=1)
یکی از راههای تبدیل ستونهای دستهبندی به ستونهای عددی این است که هر دسته را با یک عدد جایگزین کنید. بهعنوانمثال، در ستون جنسیت، زن را میتوان با 0 و مرد را با 1 جایگزین کرد، یا بالعکس. این برای ستونهایی با دودسته کار میکند.
برای ستونی مانند جغرافیا با سه دسته یا بیشتر، میتوانید از مقادیر 0، 1 و 2 برای سه کشور فرانسه، آلمان و اسپانیا استفاده کنید. بااینحال، اگر این کار را انجام دهیم، الگوریتمهای یادگیری ماشین فرض میکنند که یک رابطه ترتیبی بین این سه کشور وجود دارد. بهعبارتدیگر، الگوریتم فرض میکند که 2 بزرگتر از 1 و 0 است که درواقع ازنظر کشورهای زیربنایی که اعداد نشان میدهند اینطور نیست.
یکراه بهتر برای تبدیل چنین ستونهای دستهبندی به ستونهای عددی، استفاده از one-hot encoding است. در این فرآیند، دستههای خود را (فرانسه، آلمان، اسپانیا) میگیریم و آنها را با ستون نشان میدهیم. در هر ستون از 1 برای تعیین اینکه دسته برای ردیف فعلی وجود دارد و در غیر این صورت از 0 استفاده میکنیم.
در این مورد، با سه دسته فرانسه، آلمان و اسپانیا، میتوانیم دادههای دستهبندی خود را تنها با دو ستون نمایش دهیم (مثلاً آلمان و اسپانیا). چرا؟ خوب، اگر برای یک ردیف معین داشته باشیم که جغرافیای آن فرانسه است، ستون آلمان و اسپانیا هر دو دارای 0 خواهند بود، به این معنی که کشور باید کشور باقیمانده باشد که با هیچ ستونی نشان داده نشده است. پس توجه کنید که ما درواقع به یک ستون جداگانه برای فرانسه نیاز نداریم. پس در پیش بینی churn موردبحث از آن استفاده میکنیم.
بیایید هر دو ستون جغرافیا و جنسیت را به ستونهای عددی تبدیل کنیم. اسکریپت زیر را اجرا کنید:
Geography = pd.get_dummies(customer_data.Geography).iloc[:,1:]
Gender = pd.get_dummies(customer_data.Gender).iloc[:,1:]
متد get_dummies کتابخانه پانداها، ستونهای دستهبندی را به ستونهای عددی تبدیل میکند. سپس، .iloc[:,1:] ستون اول را نادیده میگیرد و بقیه ستونها (آلمان و اسپانیا) را برمیگرداند. همانطور که در بالا ذکر شد، این به این دلیل است که ما همیشه میتوانیم دستههای “n” را با ستونهای “n – 1” نشان دهیم.
حالا اگر فریمهای داده Geography و customer_data را در پنجره Variable Explorer بازکنید، باید چیزی شبیه به این ببینید:
مطابق با توضیح قبلی ما، چارچوب داده جغرافیا شامل دو ستون بهجای سه ستون است. وقتی جغرافیا فرانسه است، هم آلمان و هم اسپانیا دارای 0 هستند. وقتی جغرافیای اسپانیا است، میتوانید یک عدد 1 را در ستون اسپانیا و یک عدد 0 را در ستون آلمان ببینید. بهطور مشابه، در مورد آلمان، میتوانید یک عدد 1 را در ستون آلمان و یک عدد 0 را در ستون اسپانیا ببینید.
در مرحله بعد، برای ایجاد مجموعه داده نهایی، باید فریمهای داده جغرافیا و جنسیت را به مجموعه داده اضافه کنیم. میتوانید از تابع concat از پانداها برای به هم پیوستن افقی دو فریم داده مانند شکل زیر استفاده کنیم:
dataset = pd.concat([dataset,Geography,Gender], axis=1)
مرحله 5: پیشپردازش دادهها
در این مرحله از پیش بینی churn دادههای ما اکنون آماده است و میتوانیم مدل یادگیری ماشینی خود را برای آن آموزش دهیم؛ اما ابتدا باید متغیری را که پیشبینی میکنیم از مجموعه داده جدا کنیم. این کار با استفاده از روش زیر انجام میشود.
X = dataset.drop(['Exited'], axis=1)
y = dataset['Exited']
در اینجا، X مجموعه ویژگیهای ما است. این شامل تمام ستونها بهجز ستونی است که باید پیش بینی کنیم (Exited). مجموعه برچسب، y، فقط شامل ستون Exited است؛ بنابراین میتوانیم بعداً عملکرد مدل یادگیری ماشینی خود را ارزیابی کنیم.
اکنون اجازه دهید دادهها را نیز به یک مجموعه آموزشی و آزمایشی تقسیم کنیم. مجموعه آموزشی حاوی دادههایی است که برای آموزش مدل یادگیری ماشین ما استفاده میشود. مجموعه تست برای ارزیابی اینکه مدل ما چقدر خوب است استفاده خواهد شد. ما 20٪ از دادهها را برای مجموعه تست و 80٪ باقیمانده را برای مجموعه آموزشی استفاده خواهیم کرد (مشخصشده با آرگومان test_size):
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
مرحله 6: آموزش الگوریتم یادگیری ماشین
اکنون، ما از یک الگوریتم یادگیری ماشینی برای پیش بینی churn استفاده خواهیم کرد که الگوها یا روندها را در دادههای آموزشی شناسایی میکند. این مرحله به آموزش الگوریتم معروف است. ما ویژگیها و خروجی صحیح را به الگوریتم تغذیه میکنیم. بر اساس آن دادهها، الگوریتم یاد خواهد گرفت که ارتباط بین ویژگیها و خروجیها را بیابد. پس از آموزش الگوریتم، میتوانید از آن برای پیش بینی دادههای جدید استفاده کنید.
چندین الگوریتم یادگیری ماشین وجود دارد که میتوان از آنها برای انجام چنین پیشبینیهایی استفاده کرد. ما در این آموزش از الگوریتم جنگل تصادفی (random forest) استفاده خواهیم کرد، زیرا این الگوریتم ساده و یکی از قدرتمندترین الگوریتمها برای مسائل طبقهبندی است.
برای آموزش این الگوریتم، متد فیت (fit) را فراخوانی میکنیم و درمجموع ویژگی (X) و مجموعه برچسب مربوطه (y) پاس میدهیم. سپس میتوانیم از روش پیش بینی برای پیش بینی درمجموع تست استفاده کنید. به اسکریپت زیر نگاه کنید:
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=200, random_state=0)
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
مرحله 7: ارزیابی الگوریتم یادگیری ماشین
اکنونکه الگوریتم آموزش دادهشده است، زمان آن است که ببینیم الگوریتم پیش بینی churn چقدر خوب عمل میکند. برای ارزیابی عملکرد یک الگوریتم طبقهبندی، متداولترین معیارهای مورداستفاده عبارتاند از F1 MEASURE، PRECISION، Recall و ACCURACY. در کتابخانه scikit-learn پایتون، میتوانیم از توابع داخلی برای یافتن همه این مقادیر استفاده کنیم؛ بنابراین ما اسکریپت زیر را اجرا خواهیم:
from sklearn.metrics import classification_report, accuracy_score
print(classification_report(y_test,predictions ))
print(accuracy_score(y_test, predictions ))
خروجی آن به شکل زیر خواهد بود:
مرحله 8: ارزیابی ویژگی در پیش بینی churn
بهعنوان آخرین مرحله در آموزش پیش بینی churn، بیایید ببینیم که کدام ویژگی مهمترین نقش را در شناسایی ریزش مشتری ایفا میکند. خوشبختانه، RandomForestClassifier دارای ویژگی به نام feature_importance است که حاوی اطلاعاتی در مورد مهمترین ویژگیهای یک طبقهبندی معین است.
کد زیر یک نمودار میلهای از 10 ویژگی برتر برای پیش بینی ریزش مشتری ایجاد میکند:
feat_importances = pd.Series(classifier.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
و خروجی بهصورت زیر است:
بر اساس این دادهها، میتوانیم ببینیم که سن بیشترین تأثیر را بر ریزش مشتری دارد و پسازآن حقوق و دستمزد تخمینی مشتری و ماندهحساب.
قطعه کد پیش بینی churn برای پایتون
قطعه کد پایتون پیش بینی ریزش مشتری برای این اپلیکیشنی که ما ساختیم به صورت کلی مانند زیر است:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
customer_data = pd.read_csv(r'C:/Users/user/Dropbox/PC/Desktop/churn/Churn_Modelling.csv')
columns = customer_data.columns.values.tolist()
print(columns)
dataset = customer_data.drop(['RowNumber', 'CustomerId', 'Surname'], axis=1)
dataset = dataset.drop(['Geography', 'Gender'], axis=1)
Geography = pd.get_dummies(customer_data.Geography).iloc[:,1:]
Gender = pd.get_dummies(customer_data.Gender).iloc[:,1:]
dataset = pd.concat([dataset,Geography,Gender], axis=1)
X = dataset.drop(['Exited'], axis=1)
y = dataset['Exited']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=200, random_state=0)
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
from sklearn.metrics import classification_report, accuracy_score
print(classification_report(y_test,predictions ))
print(accuracy_score(y_test, predictions ))
feat_importances = pd.Series(classifier.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
نتیجهگیری
پیشبینی ریزش مشتری یا پیش بینی churn برای ثبات مالی بلندمدت یک شرکت بسیار مهم است. در این مقاله، ما با موفقیت یک مدل یادگیری ماشین ایجاد کردیم که میتواند ریزش مشتری را با دقت 86.35% پیشبینی کند. میتوانیم ببینیم که ایجاد یک مدل یادگیری ماشینی برای کارهای طبقهبندی چقدر آسان و ساده است.
بسیار خوب و پر محتوا بود، لطفا از این دست پست ها بیشتر بزارین