پیش بینی ریزش در صنعت مخابرات با استفاده از پایتون

من قصد دارم برنامه ای ایجاد کنم که بتواند ریزش مشتری را پیش بینی کند
ریزش مشتری زمانی اتفاق میافتد که مشترکین یا مشتریان در مدت زمان مشخصی تجارت با شرکت را متوقف میکنند و حفظ مشتری برای شرکتها مهمتر است، زیرا باعث افزایش درآمد شرکت میشود و به شرکت کمک میکند تا رابطه معناداری با شرکت ایجاد کند.
در واقع، حفظ مشتری ارزشمندتر از جذب مشتری است.
برنامه پایتون برای پیش بینی ریزش مشتری
واردات کتابخانه ها
import pandas as pd
import numpy as np
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
مجموعه داده را در پایتون بارگیری کنید
اکنون، من میخواهم مجموعه دادههای خود را بارگیری کنم، بنابراین باید از کتابخانه Google برای انجام این کار استفاده کنم
در زیر دستورات وارد کردن داده ها به صورت مشارکتی آمده است
from google.colab import files
uploaded = files.upload()
پس از اجرای این سلول، روی انتخاب فایل کلیک کنید و فایلی را که میخواهید از دادههای ریزش مشتری خود آپلود کنید، آپلود کنید
داده ها را در یک قاب داده بارگذاری کنید
در اینجا، من یک متغیر به نام DF ایجاد کرده ام که مخفف عبارت data frame است. در اینجا می خواهم به طور خاص به داده ها و پنج ردیف اول داده ها نگاه کنم.
df = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')
df.head(7)
و اکنون میتوانیم نگاهی به چارچوب داده بیندازیم. همانطور که می بینیم همه ستون های خود را در بالا داریم و همچنین تا پایین می توانیم ستون هدف خود را که “Churn” نامیده می شود، مشاهده کنیم. و ما می توانیم ببینیم که مقادیر در این ستون بله و خیر به نظر می رسد. بنابراین نه به این معنی است که مشتری انصراف نداده است و البته بله به این معنی است که مشتری از کار افتاده است و هر ردیف یک مشتری است.
نمایش تعداد سطرها و ستون ها
پس فقط تایپ کنید،
df.shape
(7043, 21)
و می بینیم که هفت هزار و چهل و سه ردیف یا مشتری در این مجموعه داده وجود دارد و بیست و یک ستون یا نقطه داده روی هر مشتری وجود دارد.
نمایش همه ستون ها
df.columns.values
آرایه([‘customerID’, ‘gender’, ‘SeniorCitizen’, ‘Partner’, ‘Dependents’, ‘tenure’, ‘PhoneService’, ‘MultipleLines’, ‘InternetService’, ‘OnlineSecurity’, ‘OnlineBackup’, ‘DeviceProtection’, ‘TechSupport’, ‘StreamingTV’, ‘StreamingMovies’, ‘Contract’, ‘PaperlessBilling’, ‘PaymentMethod’, ‘MonthlyCharges’, ‘TotalCharges’, ‘Churn’]، dtype=object)
بنابراین، در اینجا میتوانیم نام همه ستونها را ببینیم و بلافاصله میتوانم ستونهای جالبی مانند شناسه مشتری، جنسیت، خدمات تلفن، خدمات اینترنتی، قرارداد، هزینههای ماهانه، دوره تصدی و مشخصاً ریزش را ببینم.
داده های از دست رفته یا مقادیر NA را بررسی کنید
بنابراین برای انجام این کار فقط تایپ کنید،
df. isna(). sum()
پس از اجرای سلول، میتوانم نام ستونها را در سمت چپ و تعداد مقادیر از دست رفته را برای هر ستون در سمت راست و راست ببینم، هر مقدار منفرد صفر است، بنابراین به من میگوید که این دادهها هیچ مقادیر گمشدهای ندارند.
نمایش برخی از آمارها
بنابراین، برای نشان دادن برخی از آمار، فقط کافی است اینجا تایپ کنید،
df.describe()
و در اینجا ما آماری از مجموعه داده ها را دریافت می کنیم. بنابراین بلافاصله می بینیم که حداکثر دوره تصدی 72 ماه است که حدود شش سال است و حداقل دوره تصدی صفر ماه و میانگین دوره تصدی 32 ماه است. در حال حاضر حداکثر شارژ ماهانه 118 دلار با برخی امتیازات برای یک مشتری و حداقل شارژ ماهانه 18 دلار و 250000 سنت برای مشتری و میانگین برای مشتریان 64.761692 دلار بوده است.
تعداد ریزش مشتری را دریافت کنید
اولین سوال من این است که چند نفر در حال چروکیدن هستند و چند نفر دیگر چروکیده نمی شوند یا نگه داشته و لکه دار نمی شوند. بنابراین، برای بدست آوردن آن تعداد، فقط باید تایپ کنم،
df['Churn'] . value_counts()
اکنون می بینیم که پنج هزار و یکصد و هفتاد و چهار مشتری این شرکت ریزش نکرده و هزار و هشتصد و شصت و نه مشتری این شرکت ریزش خواهند کرد.
تعداد دفعات مشتری را تجسم کنید
بنابراین برای این فقط تایپ کنید،
sns.countplot(df['Churn'])
اکنون میتوانیم به صورت بصری همان شمارشها را بهعنوان نمودار میلهای در اینجا ببینیم، بنابراین کمی واضحتر میشود که مشتریانی هستند که در شرکت میمانند و سپس مشتریانی هستند که شرکت را ترک میکنند.
درصد مشتریانی که ترک می کنند چقدر است؟
num_retained = df[df.Churn == 'No']. shape[0]
num_Churned = df[df.Churn == 'yes']. shape[0]
#print the percentages of customer that stayed
print( num_retained / (num_retained + num_Churned) * 100, '% of customers stayed with the company.')
#print the percentages of customer that left
print( num_Churned / (num_retained + num_Churned) * 100, '% of customers left with the company.')
73.0 درصد از مشتریان در شرکت ماندند.
26.0 درصد از مشتریان شرکت را ترک کردند.
همانطور که می بینیم هفتاد و سه درصد از مشتریان در شرکت ماندند و 26 درصد از افراد شرکت را ترک کردند. بنابراین، این مهم است زیرا این به من می گوید که اگر به طور تصادفی یک مشتری از این مجموعه داده باشد و اگر مجبور باشم حدس بزنم که اگر مشتری ریزش کند یا ریزش نداشته باشد معمولاً شانس شما 50/50 است اما بر اساس این داده ها بسیار است. نامتعادل بنابراین، برای هر مشتری که به طور تصادفی انتخاب میکنم، شانس بیشتری برای حدس زدن اینکه مشتری در شرکت باقی میماند و زمانی که تمام مجموعه دادهها را تمام میکنم، ۷۳ درصد از مشتریان را به دست میآورم. بنابراین، مدلی که من ساختم باید بهتر از 73 درصد باشد.
تعداد ریزش را هم برای مرد و هم برای زن تجسم کنید
حالا میخواهم تعداد دفعات مرد و زن را تجسم کنم. پس فقط تایپ کن
sns.countplot(x='gender', hue="Churn", data = df)
همانطور که می بینیم به نظر می رسد تفاوت چندانی در اینجا وجود ندارد، بنابراین به نظر نمی رسد که تعداد مردان یا زنان بیشتری از این شرکت خارج شوند یا در شرکت بمانند، حتی بر اساس این نمودار به نظر می رسد. بنابراین شاید ما نخواهیم نگاهی به جنسیت بیندازیم تا بفهمیم چرا این مشتریان شرکت هستند. فکر نمی کنم جنسیت ربطی به آن داشته باشد.
تعداد ریزش برای سرویس اینترنت را تجسم کنید
اکنون میخواهیم تعداد ریزش برای سرویس اینترنت را تجسم کنیم. پس فقط تایپ کن
sns.countplot( x='InternetService', hue="Churn", data = df)
اکنون ما چیز مفیدی را برمی گردانیم تا بلافاصله بتوانیم ببینیم که بیشترین تعداد مشتریانی که انصراف نداده اند دارای سرویس اینترنت dsl هستند و بیشترین تعداد برای مشتریانی که ریزش کرده اند دارای سرویس اینترنت فیبر نوری هستند.
بیایید نگاهی به برخی از ستون های دیگر بیاندازیم. بنابراین، برای این من می خواهم ایجاد کنم،
numerical_features = ['tenure', 'MonthlyCharges']
fig, ax = plt.subplots(1, 2, figsize=(28,8))
df[df.Churn =='No'][numerical_features].hist(bins=20, color="blue", alpha=0.5, ax = ax)
df[df.Churn =='Yes'][numerical_features].hist(bins=20, color="orange", alpha=0.5, ax = ax)
بنابراین، در اینجا من می خواهم به دو ستون که حق تصدی و هزینه های ماهانه هستند نگاه کنم زیرا از ابتدا بسیار جالب بودند و این بار به جای نمودار میله ای از هیستوگرام استفاده کردم. همانطور که می بینیم که اکثر مشتریانی که اقامت دارند هزینه های ماهیانه بین 20 تا 30 دلار دارند و این با این مقدار زیاد در نمودار بالا بسیار واضح است و آنچه که می توانیم مشاهده کنیم این است که تعداد ریزش در جایی بسیار بیشتر است. بین 70 تا 100 دلار برای هزینه های ماهانه. بنابراین، به نظر می رسد که نسبتا واضح است.
و سپس به دوره تصدی نگاه خواهیم کرد و میتوانیم ببینیم که اکثر مشتریانی که بین صفر تا ده ماه ریزش میکنند و برای مشتریانی که ریزش نکردهاند به نظر میرسد اساساً دوره تصدی بالاتری دارند، بنابراین به نظر میرسد جایی است. بین 65 تا 72 ماه پس آنهایی که رفتند تصدی کمتری دارند و آنهایی که ماندند دوره تصدی بالاتری دارند.
حذف ستون های غیر ضروری
همانطور که می بینم ستون ID مشتری برای مدل بی فایده خواهد بود، بنابراین، بیایید این ستون را از مجموعه داده های خود حذف کنیم. بنابراین، من تعدادی متغیر به شرح زیر ایجاد کرده ام.
cleaned_df =df.drop('customerID', axis =1)
به تعداد سطرها و ستون ها در مجموعه داده ها نگاه کنید
با اجرای دستور زیر می توانیم به تعداد سطرها و ستون ها در مجموعه داده نگاه کنیم.
cleaned_df.shape
بنابراین، اکنون می توانم ببینم که هنوز هفت هزار و چهل و سه ردیف وجود دارد، اما اکنون تنها 20 ردیف وجود دارد که قبلاً 21 ستون بود.
تمام ستون های غیر عددی را به عددی تبدیل کنید
در زیر دستورات تبدیل مقادیر غیر عددی به عددی آمده است.
from sklearn.preprocessing import LabelEncoder
# select only columns with object data types (categorical variables)
cat_cols = cleaned_df.select_dtypes(include=['object']).columns
# convert object data types to categorical codes
for col in cat_cols:
cleaned_df[col] = cleaned_df[col].astype('category').cat.codes
# convert the remaining numeric columns to float
num_cols = cleaned_df.select_dtypes(include=['float', 'int']).columns
cleaned_df[num_cols] = cleaned_df[num_cols].astype('float')
انواع داده های مجموعه داده جدید را نشان دهید
حال بیایید نگاهی به مجموعه داده ها و انواع داده های جدید بیندازیم. بنابراین، فقط تایپ کنید؛
cleaned_df.dtypes
بنابراین اکنون میتوانیم ببینیم که تمام انواع دادههای مجموعه داده ما اعداد هستند.
نمایش پنج ردیف اول مجموعه داده های جدید
در این سلول می خواهم پنج ردیف اول مجموعه داده جدیدمان را نشان دهم. بنابراین، فقط تایپ کنید؛
cleaned_df.head()
اکنون میتوانیم ببینیم، نمونهای از دادهها همه اعدادی هستند که انتظار میرود.
داده ها را مقیاس بندی کرد
بنابراین، من مجموعه داده ویژگی را ایجاد میکنم که X نامیده میشود و شامل تمام ستونهای دادههای DF میشود، به جز چرخش ستون که هدف ما است.
X = cleaned_df.drop('Churn', axis= 1) #Feature data set
y = cleaned_df['Churn'] #target data set
X = StandardScaler().fit_transform(X)
داده ها را به 80% آموزش و 20% تست تقسیم کنید
در اینجا، من دادهها را به هشتاد درصد آموزش و بیست درصد آزمایش تقسیم میکنم، بنابراین بیایید متغیرهایی را به صورت زیر ایجاد کنیم:
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)
مدل را ایجاد کنید
حال بیایید یک متغیر به نام مدل ایجاد کنیم و آن را برابر با رگرسیون لجستیک به صورت زیر قرار دهیم:
# create the model
model = LogisticRegression()
#train the model
model.fit(x_train, y_train)
پس از اجرای این دستورات، نتایج زیر را دریافت می کنیم.
پیش بینی را روی داده های تست ایجاد کنید
برای انجام برخی پیشبینیها، بیایید یک مدل ایجاد کنیم و آن را به صورت زیر برابر کنیم:
predictions = model.predict(x_test)
#print the predictions
print(predictions)
پس از اجرای دستورات و دریافت نتایج بالا، بدیهی است که ما نمیتوانیم تمام دادههای چاپ آن را ببینیم، اما اگر میخواهید، میتوانید یکی یکی بروید و به هر پیشبینی دادههای تست نگاه کنید و آن را با دادههای آزمایش هدف مقایسه کنید.
دقت، یادآوری، امتیاز F1 را بررسی کنید
در اینجا من قصد دارم دقت، فراخوانی و امتیاز f1 را برای مدل خود بررسی کنم.
print(classification_report(y_test, predictions))
بیایید این را اجرا کنیم و ببینیم مدل چقدر خوب عمل کرده است؟
بنابراین، اکنون میتوانیم ببینیم که مدل ما حدود 91 درصد فراخوانی دارد که واقعاً خوب است و 85 درصد دقت دارد که بد نیست و به عنوان یک امتیاز f1 88 درصد است که بسیار خوب است زیرا حداکثر امتیاز f1 میتواند صد باشد. درصد و دقت آن حدود 82% است که از حدس زدن بهتر از 73% است. بنابراین، این مدل بسیار مفید خواهد بود زیرا بهتر از حدس زدن است.