数据分析3-电信行业用户流失预测实例

    技术2022-07-11  110

    目录

    四、数据预处理4-1 删除4-2标准化4-3 箱线图4-4 查看字段的值4-5 替换值4-6 编码 五 、构建模型5-1 划分数据集5-2 选择机器学习算法5-3 训练模型5-4 评估模型 六、方案实施七、结论

    四、数据预处理

    4-1 删除

    由前面结果可知,(参考数据分析1,2)CustomerID表示每个客户的随机字符,对后续建模不影响,我这里选择删除CustomerID列;gender 和 PhoneService 与流失率的相关性低,可直接忽略。

    #数据预处理 df1=df.iloc[:,2:20] df1.drop("PhoneService",axis=1,inplace=True) df_id=df["customerID"] df1.head()

    数据展示: 对客户的职位、月费用和总费用进行去均值和方差缩放,对数据进行标准化:使得数据方差为1,均值为0,则预测结果不会被某些维度过大的特征值主导

    4-2标准化

    #数据标准化 from sklearn.preprocessing import StandardScaler scaler=StandardScaler(copy=False) scaler.fit_transform(df1[['tenure','MonthlyCharges','TotalCharges']])

    标准化后:

    4-3 箱线图

    使用箱线图查看数据是否存在异常值: 第一种:

    df1[['tenure','MonthlyCharges','TotalCharges']]=scaler.transform(df1[['tenure','MonthlyCharges','TotalCharges']]) df1[['tenure','MonthlyCharges','TotalCharges']].plot(kind='box',subplots=True,layout=(3,1),sharex=False,fontsize=8) pyplot.show()

    第二种:

    #使用箱线图查看数据异常值 import seaborn as sns df1[['tenure','MonthlyCharges','TotalCharges']]=scaler.transform(df1[['tenure','MonthlyCharges','TotalCharges']]) plt.figure(figsize=(8,4)) sns.boxplot(data=df1[['tenure','MonthlyCharges','TotalCharges']],palette="Set1")

    由以上结果可以看出,在三个变量中不存在明显的异常值。

    4-4 查看字段的值

    查看对象类型字段中存在的值:

    #查看对象类型字段中存在的值 def uni(columnlabel): print(columnlabel,"--",df1[columnlabel].unique()) x=df1.select_dtypes(['object']) for i in range(0,len(x.columns)): uni(x.columns[i])

    综合之前的结果来看,在六个变量中存在No internet service,即无互联网服务对客户流失率影响很小,这些客户不使用任何互联网产品,因此可以将No internet service 和 No 是一样的效果,可以使用 No 替代 No internet service。

    4-5 替换值

    #替换值 df1.replace(to_replace="No internet service",value='No',inplace=True) df1.replace(to_replace="No phone service",value='No',inplace=True) for i in range(0,len(x.columns)): uni(x.columns[i])

    4-6 编码

    Scikit-learn标签编码,将分类数据转换为整数编码:

    #使用Scikit-learn标签编码,将分类数据转换为整数编码 from sklearn.preprocessing import LabelEncoder def labelencode(columnlabel): df1[columnlabel]=LabelEncoder().fit_transform(df1[columnlabel]) for i in range(0,len(x.columns)): labelencode(x.columns[i]) for i in range(0,len(x.columns)): uni(x.columns[i])

    五 、构建模型

    5-1 划分数据集

    from sklearn.model_selection import StratifiedShuffleSplit X=df1 y=df["Churn"].values s=StratifiedShuffleSplit(n_splits=5,test_size=0.2,random_state=0) print(s) print(s.get_n_splits(X,y))

    训练数据和测试数据被分成五组 建立训练数据与测试数据:

    #建立训练数据和测试数据 for tr_index,te_index in s.split(X,y): print("train:",tr_index,"test:",te_index) X_train,X_test=X.iloc[tr_index],X.iloc[te_index] y_train,y_test=y[tr_index],y[te_index]

    5-2 选择机器学习算法

    这里我选择了5种分类算法。随机森林,决策树,线性支持向量机,K最近邻,朴素贝叶斯算法

    #选择机器算法 #选择机器学习方法 from sklearn.ensemble import RandomForestClassifier from sklearn import tree from sklearn.naive_bayes import GaussianNB from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import LinearSVC models=[['rfc',RandomForestClassifier()], ['tree',tree.DecisionTreeClassifier()], ['kmeans',KMeans()], ['gnb',GaussianNB()], ['knn',KNeighborsClassifier()], ['lsvc',LinearSVC()]]

    5-3 训练模型

    #训练模型 from sklearn.metrics import accuracy_score from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report,precision_score,recall_score,f1_score results=[] names=[] prediction=[] for name,model in models: model=model model.fit(X_train,y_train) y_pred=model.predict(X_test) recall=recall_score(y_test,y_pred,average='micro') precision=precision_score(y_test,y_pred,average='micro') f1score=f1_score(y_test,y_pred,average='micro') class_eva=pd.DataFrame([recall,precision,f1score]) results.append(class_eva) name=pd.Series(name) names.append(name) #y_pred=pd.Series(y_pred) prediction.append(y_pred) print("模型:%s"%name) print('accuracy %s' % accuracy_score(y_pred, y_test)) print(classification_report(y_test, y_pred)) conf_mat = confusion_matrix(y_test, y_pred) fig, ax = plt.subplots(figsize=(4,4)) sns.heatmap(conf_mat, annot=True, fmt='d', ) plt.ylabel('实际结果',fontsize=10) plt.xlabel('预测结果',fontsize=10) plt.show()

    对于模型随机森林,预测正确率为78.89%左右 混淆矩阵如下: 对于模型决策树,预测正确率为73.13%左右 混淆矩阵如下: 对于模型朴素贝叶斯,预测正确率为:76.72%左右 混淆矩阵如下: 对于模型k-最近邻,预测正确率为75.69%左右 混淆矩阵如下: 对于模型支持向量机,预测正确率为27.08%左右 混淆矩阵如下:

    5-4 评估模型

    召回率(recall)的含义是:原本为对的当中,预测为对的比例(值越大越好,1为理想状态) 精确率、精度(precision)的含义是:预测为对的当中,原本为对的比例(值越大越好,1为理想状态) F1分数(F1-Score)指标综合了Precision与Recall的产出的结果F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。

    #评估算法 names=pd.DataFrame(names) result=pd.concat(results,axis=1) result.columns=names[0].tolist() result.index=["recall","precision","f1score"] result

    可以看出,模型随机森林的训练效果最好,支持向量机的训练效果最差。

    六、方案实施

    #实施方案-随机森林 pred_X=df1.tail(10) #提取customerID pred_id=df_id.tail(10) pred_id #使用随机森林算法预测 model=RandomForestClassifier() model.fit(X_train,y_train) pred_y=model.predict(pred_X) #预测结果 pred=pd.DataFrame({'customerID':pred_id,'Churn':pred_y}) pred

    我实施了随机森林模型:预测结果。

    七、结论

    通过数据分析-1,数据分析-2,以及本文的分析, 我们可以大致得出容易流失的用户特征: 1、老年用户与未婚且经济未独立的青少年用户更容易流失。 2、电话服务对用户的流失没有直接的影响。 3、提供的各项网络服务项目能够降低用户的流失率。 4、签订合同越久,用户的留存率越高。 5、采用electronic check支付的用户更易流失。 针对上述诊断结果,可有针对性的对此提出建议: 推荐老年用户与青少年用户采用数字网络,且签订2年期合同(可以各种辅助优惠等营销手段来提高2年期合同的签订率),若能开通相关网络服务可增加用户粘性,因此可增加这块业务的推广,同时考虑改善电子账单支付的用户体验。

    Processed: 0.010, SQL: 9