我将创建一个可以预测客户流失的程序
当订阅者或客户在特定时间内停止与公司开展业务并且保留客户对公司的业务更为重要时,就会发生客户流失。
实际上,客户保留比客户获取更有价值。
Python计划预测客户流失
导入库
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
将数据集加载到Python中
现在,我要加载数据集,所以我要使用Google的库来执行此操作
以下是导入共物中数据的命令
from google.colab import files
uploaded = files.upload()
运行此单元格后,单击“选择文件”并上传您要从客户流失数据上传的文件
将数据加载到数据框架中
在这里,我创建了一个名为DF的变量,该变量将是数据框架的简短。在这里,我想专门查看数据和前五行数据。
df = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')
df.head(7)
现在我们可以查看数据框架。如我们所见,我们将所有列都放在顶部,也可以直至底部,我们可以看到我们的目标列,称为“搅动”。而且我们可以看到此列中的值似乎是是和否。因此,不意味着客户不会流失,当然是肯定的,这意味着客户会搅动,每行都是顾客。
显示行的数量和列的数量
所以只是输入,
df.shape
(7043,21)
我们可以看到,在此数据集中有七千三排或客户,每个客户上有二十一列或数据点。
显示所有列
df.columns.values
array(['customerid','性别','高级活动',“合作伙伴”,“依赖”,“使用”,“ phoneservice','phoneservice',“多人线”,“ internetService”,“ onlineSecurity”,“ onlinesecurity”,“ onlinesecurity”,“ onlinebackup”,“在线back” “设备保护”,“ TechSupport”,“ Streamingtv”,“ StreamingMovies”,“ Contract”,“ PaperlessBilling”,“ PaymentMethod”,“ MonthlyCharges”,“ Monthlacholges”,“ Total Chargenges',“ Total Chargers”,“ Churn'','Churn'],dtype =对象)
)))所以,在这里我们可以看到所有列名称,我立即看到一些有趣的列,例如客户ID,性别,电话服务,互联网服务,合同,每月费用,任期,并且显然是Churn
检查丢失的数据或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%的客户留在公司。
我们可以看到,有73%的客户留在公司,而26%的人离开了公司。因此,这很重要,因为这告诉我,如果从此数据集中随机成为客户,如果我必须猜测,如果客户流失或不流动,您通常会有50/50的机会,但是基于这些数据的机会非常非常不平衡。因此,我将有更好的机会猜测客户与我随机选择的每个客户在一起,而当我完成整个数据集时,我将获得73%的客户。因此,我构建的模型必须比73%好。
可视化男性和女性的流失数量
现在,我想可视化男性和女性的流失数量。所以只输入,
sns.countplot(x='gender', hue= 'Churn', data = df)
正如我们所看到的那样此图表。因此,也许我们不想看看性别,以弄清楚这些客户为什么是公司。我认为性别没有任何关系。
可视化互联网服务的流失计数
现在,我们将可视化互联网服务的流失数量。所以只输入,
sns.countplot( x='InternetService', hue='Churn', data = df)
现在,我们正在恢复有用的东西,因此我们立即看到,没有DSL Internet服务的最多客户和最高的客户计数是Churn Churn具有光纤互联网服务的最高数量。
让我们看一下其他一些列。因此,为此,我将创建,
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数据的所有列,除了我们的目标列Churn。
X = cleaned_df.drop('Churn', axis= 1) #Feature data set
y = cleaned_df['Churn'] #target data set
X = StandardScaler().fit_transform(X)
将数据分为80%的培训和20%的测试
在这里,我将把数据分为80%的培训和20%的测试,因此,让我们创建变量为:
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)
创建模型
现在,让S创建一个称为模型的变量,并将其设置为逻辑回归如下:
# 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%的精度,这还不错,并且作为88%的F1分数,这非常好,因为最大的F1得分可以是百分之一百。它的准确性约为82%,比仅仅猜测的73%要好。因此,该模型将非常有用,因为它比猜测更好。