Python|客户流失分析预测
客户流失
当现有客户、用户、订户或任何类型的回头客停止开展业务或终止与公司的关系时。
客户流失的类型 –
- 合同流失:当客户签订服务合同并决定取消服务时,例如有线电视、SaaS。
- 自愿流失:当用户自愿取消服务,例如蜂窝连接时。
- 非合同流失:当客户没有签订服务合同并决定取消服务时,例如零售店的消费者忠诚度。
- 非自愿流失:当没有客户的任何请求而发生流失时,例如信用卡到期。
自愿流失的原因
- 缺乏使用
- 低劣的服务
- 更好的价格
代码:导入 Telco Churn 数据集
# Import required libraries
import numpy as np
import pandas as pd
# Import the dataset
dataset = pd.read_csv('telcochurndata.csv')
# Glance at the first five records
dataset.head()
# Print all the features of the data
dataset.columns
输出:
电信客户流失数据集的探索性数据分析
代码:要查找数据集中的流失者和非流失者的数量:
# Churners vs Non-Churners
dataset['Churn'].value_counts()
输出:
代码:按流失率对数据进行分组并计算平均值以确定流失者是否比非流失者拨打更多的客户服务电话:
# Group data by 'Churn' and compute the mean
print(dataset.groupby('Churn')['Customer service calls'].mean())
输出:
是的!也许不出所料,流失者似乎比非流失者拨打了更多的客户服务电话。
代码:找出一个州与另一个州相比是否有更多的流失者。
# Count the number of churners and non-churners by State
print(dataset.groupby('State')['Churn'].value_counts())
输出:
虽然加利福尼亚是美国人口最多的州,但在我们的数据集中,来自加利福尼亚的客户并不多。例如,亚利桑那州 (AZ) 有 64 位客户,其中 4 位最终流失。相比之下,加州的流失客户数量(和百分比)更高。这对公司来说是有用的信息。探索数据可视化:了解变量的分布方式。
# Import matplotlib and seaborn
import matplotlib.pyplot as plt
import seaborn as sns
# Visualize the distribution of 'Total day minutes'
plt.hist(dataset['Total day minutes'], bins = 100)
# Display the plot
plt.show()
输出:
代码:可视化流失者和非流失者之间的客户服务呼叫差异
# Create the box plot
sns.boxplot(x = 'Churn',
y = 'Customer service calls',
data = dataset,
sym = "",
hue = "International plan")
# Display the plot
plt.show()
输出:
看起来确实流失的客户最终会留下更多的客户服务电话,除非这些客户也有国际计划,在这种情况下,他们会留下更少的客户服务电话。这种类型的信息对于更好地了解客户流失的驱动因素非常有用。现在是时候了解如何在建模之前对数据进行预处理了。
电信客户流失数据集的数据预处理
许多机器学习模型对数据的分布方式做出了某些假设。一些假设如下:
- 特征是正态分布的
- 特征在同一尺度上
- 特征的数据类型是数字
在电信流失数据中, Churn 、 Voice mail plan和International plan特别是可以轻松转换为 0 和 1 的二进制特征。
# Features and Labels
X = dataset.iloc[:, 0:19].values
y = dataset.iloc[:, 19].values # Churn
# Encoding categorical data in X
from sklearn.preprocessing import LabelEncoder
labelencoder_X_1 = LabelEncoder()
X[:, 3] = labelencoder_X_1.fit_transform(X[:, 3])
labelencoder_X_2 = LabelEncoder()
X[:, 4] = labelencoder_X_2.fit_transform(X[:, 4])
# Encoding categorical data in y
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
代码:使用一种热编码对状态特征进行编码
# Removing extra column to avoid dummy variable trap
X_State = pd.get_dummies(X[:, 0], drop_first = True)
# Converting X to a dataframe
X = pd.DataFrame(X)
# Dropping the 'State' column
X = X.drop([0], axis = 1)
# Merging two dataframes
frames = [X_State, X]
result = pd.concat(frames, axis = 1, ignore_index = True)
# Final dataset with all numeric features
X = result
代码:创建训练和测试集
# Splitting the dataset into the Training and Test sets
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)
代码:缩放训练集和测试集的特征
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
代码:在训练集上训练一个随机森林分类器模型。
# Import RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
# Instantiate the classifier
clf = RandomForestClassifier()
# Fit to the training data
clf.fit(X_train, y_train)
代码:做出预测
# Predict the labels for the test set
y_pred = clf.predict(X_test)
代码:评估模型性能
# Compute accuracy
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
输出:
代码:混淆矩阵
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred))
输出:
从混淆矩阵中,我们可以计算以下指标:
- 真阳性(TP)= 51
- 真阴性 (TN) = 575
- 误报 (FP) = 4
- 假阴性(FN)= 37
- 精度 = TP/(TP+FP) = 0.92
- 召回率 = TP/(TP+FN) = 0.57
- 准确度 = (TP+TN)/(TP+TN+FP+FN) = 0.9385