用戶流失預(yù)測(cè)模型-電信行業(yè)項(xiàng)目實(shí)戰(zhàn)

本文以電信行業(yè)數(shù)據(jù)為基礎(chǔ),對(duì)其進(jìn)行用戶流失預(yù)警的建模,整理如下,歡迎拍磚~

一、流失知識(shí)點(diǎn)整理

1. 流失定義

不同產(chǎn)品存在不同的使用周期,因此在定義流失用戶上,需要去進(jìn)行用戶調(diào)研,比如可以對(duì)時(shí)隔1周、1個(gè)月、3個(gè)月、半年未下單用戶進(jìn)行用戶調(diào)研,去了解用戶不再產(chǎn)生瀏覽和購(gòu)買的行為原因,定義流失。

DAU/MAU

這里的DAU是一個(gè)月內(nèi)日活均值,MAU是月活躍用戶數(shù)去重。
DAU/MAU比值高,說(shuō)明用戶訪問(wèn)產(chǎn)品頻率高且穩(wěn)定,用戶粘性高留存率高;
相反DAU/MAU比值低,說(shuō)明用戶訪問(wèn)產(chǎn)品頻率低不穩(wěn)定,用戶粘性差留存率低;

以社交產(chǎn)品為例,DAU/MAU定義用戶流失
一般來(lái)說(shuō)0.03<DAU/MAU<1,DAU/MAU=0.03說(shuō)明活躍用戶只來(lái)一次,產(chǎn)品粘性太低;=1說(shuō)明用戶每天都來(lái)。微信的DAU/MAU處于0.8左右,一般產(chǎn)品0.3就比較好了。

2. 研究流失的目的

首要目的還是避免用戶繼續(xù)流失,其次才是挽回流失。
這里可以看用戶的生命周期判斷流失原因:
(1)獲取期:新用戶通過(guò)推廣、宣傳來(lái)到產(chǎn)品中,嘗鮮型;
(2)提升期:用戶有購(gòu)買行為
(3)成熟期:用戶存在復(fù)購(gòu)和交叉購(gòu)買行為
(4)衰退期:購(gòu)買行為和頻次開(kāi)始衰退,是最需要預(yù)警的時(shí)期
(5)離開(kāi)期:達(dá)到流失標(biāo)準(zhǔn)
根據(jù)以上五個(gè)生命周期為用戶打上標(biāo)簽,判斷用戶是在哪個(gè)時(shí)期流失,相應(yīng)的流失原因不同,采取不同措施對(duì)產(chǎn)品進(jìn)行改進(jìn)。

3. 流失指標(biāo)
  • 可以通過(guò)流失率趨勢(shì)圖定位流失率的大小


    image.png

    如圖可知,當(dāng)流失率達(dá)到40%左右開(kāi)始流失變緩且達(dá)到28天處于平穩(wěn)趨勢(shì),因此30天沒(méi)活躍就算成流失用戶。

  • 細(xì)分流失用戶的畫像
    包括與活躍用戶的行為差異、屬性差異、渠道差異等,流失之前的訪問(wèn)頻次、訪問(wèn)頁(yè)面一些列行為。
4. 確定首要挽回用戶

對(duì)于老板來(lái)說(shuō),成本有限,挽回流失用戶當(dāng)然是挑最值得挽回那一波。因此這里用到了RMF模型,總的來(lái)說(shuō)獲取期用戶的優(yōu)先級(jí)一定是低于成熟期的。這里有我寫過(guò)的RFM文章:RFM模型分析實(shí)戰(zhàn)

5. 流失用戶召回

使用push推送、短信、微信服務(wù)號(hào)等方式進(jìn)行召回
這里也同樣應(yīng)用到了流失模型。
比如:根據(jù)購(gòu)買頻次和金額來(lái)細(xì)分。
1次也沒(méi)購(gòu)買過(guò)的用戶可派發(fā)大額度優(yōu)惠券、大促活動(dòng)或超低價(jià)商品吸引回訪,成為首單新客。
購(gòu)買1—2次且客單價(jià)較低的用戶,可精準(zhǔn)推送優(yōu)惠專場(chǎng)或在這個(gè)客單水平的好貨。
購(gòu)買3次及以上的用戶,可推送用戶偏好的品牌或品類,額外增加會(huì)員專屬優(yōu)惠券等形式。

總而言之,根據(jù)用戶流失模型區(qū)分不同行為和屬性的用戶,以及他們流失的節(jié)點(diǎn)、原因,運(yùn)營(yíng)才可以做到有的放矢,強(qiáng)化用戶召回的效果。

說(shuō)在后面:用戶的召回很難,更好的做法是避免用戶流失。比如通過(guò)區(qū)分用戶生命5個(gè)周期找到用戶在各周期的流失原因進(jìn)行產(chǎn)品或運(yùn)營(yíng)改進(jìn);比如通過(guò)分析之前已流失的用戶特征屬性,行為建立預(yù)警模型,針對(duì)現(xiàn)有用戶有流失跡象提前預(yù)警提前進(jìn)行挽回打消用戶流失的念頭,這才是關(guān)鍵!

二、電信行業(yè)流失預(yù)警模型

分析目的

哪些用戶可能會(huì)流失?
流失概率高的用戶有哪些共同特征?

數(shù)據(jù)探索EDA
2.1 導(dǎo)入數(shù)據(jù)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import os
os.chdir('/Users/xy/Desktop/專業(yè)知識(shí)/電信行業(yè)流失預(yù)警/')
df = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')
2.2 數(shù)據(jù)概覽
pd.set_option('display.max_columns', None)
df.head(5)
#各個(gè)字段取值個(gè)數(shù)
for i in range(21):
    print(df.iloc[:,i].value_counts())
df.shape

customerID:用戶ID
gender:性別 male男性 female女性
SeniorCitizen:是否老年人 0否1是
Partner:是否有配偶 YES是NO否
Dependents:是否經(jīng)濟(jì)獨(dú)立 YES是NO否
tenure:客戶職位 73個(gè)
PhoneService:是否開(kāi)通電話業(yè)務(wù) YES是NO否
MultipleLines:是否開(kāi)通多線業(yè)務(wù) YES是NO否 No phoneservice
InternetService:是否開(kāi)通互聯(lián)網(wǎng)業(yè)務(wù) No, DSL數(shù)字網(wǎng)絡(luò),fiber optic光纖網(wǎng)絡(luò)
OnlineSecurity:是否開(kāi)通網(wǎng)絡(luò)安全服務(wù)YES是NO否 No phoneservice
OnlineBackup:是否開(kāi)通在線備份業(yè)務(wù)YES是NO否 No phoneservice
DeviceProtection:是否開(kāi)通了設(shè)備保護(hù)業(yè)務(wù)YES是NO否 No phoneservice
TechSupport:是否開(kāi)通了技術(shù)支持服務(wù)YES是NO否 No phoneservice
StreamingTV:是否開(kāi)通網(wǎng)絡(luò)電視YES是NO否 No phoneservice
StreamingMovies:是否開(kāi)通網(wǎng)絡(luò)電影
Contract:簽訂合同方式 按月 一年 二年
PaperlessBilling:是否開(kāi)通電子賬單YES是NO否
PaymentMethod:付款方式(bank transfer,credit card,electronic check,mailed check)
MonthlyCharges:月費(fèi)用
TotalCharges:總費(fèi)用
Churn:是否流失 YES是NO否

(7043行, 21列)

其中:
gender:男女比例均衡
SeniorCitizen:非老年人居多
Partner:有無(wú)配偶比例均衡
Dependents:經(jīng)濟(jì)獨(dú)立2k,非獨(dú)立5k
PhoneService:開(kāi)通電話業(yè)務(wù)居多
Contract:合同中按月的較多,按1年和2年的占比相似
Churn:數(shù)據(jù)集中有5174名用戶沒(méi)流失,有1869名客戶流失,數(shù)據(jù)集不均衡

2.3 數(shù)據(jù)信息
df.info()
df.isnull().sum()
image.png

未發(fā)現(xiàn)缺失值

df['TotalCharges'].apply(pd.to_numeric, errors='coerce')#object轉(zhuǎn)為float
df['TotalCharges'].isnull().sum()#再次查看缺失值
df.dropna(inplace=True)#刪除缺失行

將TotalCharges的object轉(zhuǎn)為float格式,網(wǎng)上給出的方法大多數(shù)都是dt_df = dt_df.convert_objects(convert_numeric=True),但是因?yàn)槲椰F(xiàn)在的版本號(hào)低于1.0也不想升級(jí),因此終于找到上面的方法改變類型啦!()
發(fā)現(xiàn)有11個(gè)缺失值,數(shù)量不多刪除

df['Churn'].replace('Yes',1,inplace=True)
df['Churn'].replace('No',0,inplace=True)

將df['Churn']中值變?yōu)閿?shù)值化,yes變?yōu)?,no變?yōu)?

2.4 數(shù)據(jù)可視化
2.41 流失用戶占比
plt.rcParams['font.sans-serif']=['SimHei']  #正常顯示中文
plt.rcParams['axes.unicode_minus'] = False  #正常顯示負(fù)號(hào)

labels = ['未流失用戶','流失用戶']
Churn = df['Churn'].value_counts()
plt.pie(Churn,labels=labels,autopct='%.1f%%')
image.png

流失用戶占比26.6%,未流失占比73.4%

2.42 性別、老年人、配偶、經(jīng)濟(jì)是否獨(dú)立對(duì)流失用戶的影響
plt.figure(1),plt.title('區(qū)分性別對(duì)流失的影響')
sns.countplot(x='gender',hue='Churn',data=df,palette='BuPu_r')
plt.figure(2),plt.title('區(qū)分老年人對(duì)流失的影響')
sns.countplot(x='SeniorCitizen',hue='Churn',data=df,palette='BuPu_r')
plt.figure(3),plt.title('區(qū)分配偶對(duì)流失的影響')
sns.countplot(x='Partner',hue='Churn',data=df,palette='BuPu_r')
plt.figure(4),plt.title('區(qū)分經(jīng)濟(jì)獨(dú)立對(duì)流失的影響')
sns.countplot(x='Dependents',hue='Churn',data=df,palette='BuPu_r')
image.png

image.png

image.png

image.png

可以得出結(jié)論:男性與女性之間的流失沒(méi)有差異;老年用戶流失占比比非老年用戶高;沒(méi)有配偶的流失占比高于有配偶的流失占比;經(jīng)濟(jì)未獨(dú)立的流失率遠(yuǎn)高于經(jīng)濟(jì)獨(dú)立;

2.43 特征之間的關(guān)系

想知道特征之間的關(guān)系,需要將這些特征以數(shù)值形式展現(xiàn)。這里就用到LabelEncoder或pd.factorize,LabelEncoder能將文本或非連續(xù)性數(shù)字進(jìn)行編號(hào),缺點(diǎn)是該編碼方法有順序關(guān)系。pd.factorize與LabelEncoder的區(qū)別是:pd.factorize支持None默認(rèn)不排序。pd.factorize()返回兩個(gè)值前面值為編碼后的值,后面為原來(lái)值。

  • 使用LabelEncoder進(jìn)行編碼化:
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
lst = []
columns=['gender', 'SeniorCitizen', 'Partner', 'Dependents',
       'tenure', 'PhoneService', 'MultipleLines', 'InternetService',
       'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport',
       'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling',
       'PaymentMethod', 'MonthlyCharges', 'TotalCharges']
for i in range(1,20):
    corrdf = labelencoder.fit_transform(df.iloc[:,i])
    lst.append(corrdf)
df2 = pd.DataFrame(map(list,zip(*lst)),columns=columns)
df2.corr()

用corr相關(guān)矩陣難以看出這些列之間的關(guān)系,可以用熱力圖。

plt.figure(figsize=(16,8))
sns.heatmap(df2.corr(),cmap='YlGnBu',annot=True)

image.png

通常情況下通過(guò)以下取值范圍判斷變量的相關(guān)強(qiáng)度:
相關(guān)系數(shù)
0.8-1.0 極強(qiáng)相關(guān)
0.6-0.8 強(qiáng)相關(guān)
0.4-0.6 中等程度相關(guān)
0.2-0.4 弱相關(guān)
0.0-0.2 極弱相關(guān)或無(wú)相關(guān)

從熱力圖矩陣中能夠明顯看出配偶與經(jīng)濟(jì)獨(dú)立有一定關(guān)系,職業(yè)與繳納總費(fèi)用以及合同期限有強(qiáng)相關(guān)關(guān)系

  • 使用pd.factorize進(jìn)行編碼化:
charge=df.iloc[:,1:20]#取要編碼的列
for i in range(0,19):
    charge.iloc[:,i] = pd.factorize(charge.iloc[:,i])[0]
plt.figure(figsize=(16,8))
sns.heatmap(charge.corr(),cmap='YlGnBu',annot=True)
image.png

可以看出電話業(yè)務(wù)與多線業(yè)務(wù)之間存在強(qiáng)相關(guān)性,互聯(lián)網(wǎng)服務(wù)、網(wǎng)絡(luò)安全服務(wù)、在線備份業(yè)務(wù)、設(shè)備保護(hù)業(yè)務(wù)、技術(shù)支持服務(wù)、網(wǎng)絡(luò)電視和網(wǎng)絡(luò)電影之間存在較強(qiáng)的相關(guān)性,并且都呈正相關(guān)關(guān)系。

我稍微研究了下兩者編碼后的區(qū)別,都是按照從上到下出現(xiàn)順序?qū)﹄x散非數(shù)值變量進(jìn)行0,1,...的編碼;對(duì)于離散數(shù)值變量如職業(yè),labelencoder按照原數(shù)據(jù)大小從0向后依次編碼,而pd.factorize仍舊按照出現(xiàn)順序不分大小進(jìn)行編碼。這樣也就解釋了為什么在pd.factorize中有明顯關(guān)系的幾個(gè)列在labelencoder無(wú)明顯關(guān)系了,因?yàn)楸籰abelencoder中的有大小順序掩蓋了。(僅個(gè)人見(jiàn)解)

2.44 特征與churn之間的關(guān)系

首先介紹連續(xù)數(shù)據(jù)離散化相關(guān)知識(shí)點(diǎn):
一般在回歸、分類、聚類算法中,特征之間計(jì)算歐式距離來(lái)計(jì)算相似度十分重要。當(dāng)特征中既包括離散變量也包括連續(xù)變量,或存在數(shù)量級(jí)不一致的情況下,就要進(jìn)行歸一化。
(1)連續(xù)變量處理方法

  • 最大最小值歸一化[0,1] x = (x-x.min)/(x.max-x.min)

  • 標(biāo)準(zhǔn)化z_score x= (x-x.mean)/σ
    (2)離散變量處理方法-onehot編碼,將離散取值擴(kuò)展到歐式空間上。

  • pd.get_dummies:適合于含有字符串類型的數(shù)據(jù)

  • OneHotEncoder():適用于含有數(shù)值的數(shù)據(jù)

  • Churn與各特征之間相關(guān)性

df_churn = pd.get_dummies(df.iloc[:,1:21])
plt.figure(figsize=(16,8)),plt.title('Churn與各特征之間相關(guān)性')
df_churn.corr()['Chaurn'].sort_values(ascending=False).plot(kind='bar')
image.png

可見(jiàn)變量gender 和 PhoneService處于中間,相關(guān)性非常小,可以舍棄。

  • 網(wǎng)絡(luò)安全服務(wù)、在線備份業(yè)務(wù)、設(shè)備保護(hù)業(yè)務(wù)、技術(shù)支持服務(wù)、網(wǎng)絡(luò)電視和網(wǎng)絡(luò)電影對(duì)流失影響
columns=['OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport',
       'StreamingTV', 'StreamingMovies']
fig,axes = plt.subplots(nrows=2,ncols=3,figsize=(16,10))
for i,item in enumerate(columns):#enumerate變量數(shù)據(jù)對(duì)象如列表,返回每個(gè)數(shù)據(jù)及其下標(biāo)
    plt.subplot(2,3,(i+1))
    ax = sns.countplot(x=item,hue='Churn',data=df,order=['Yes','No','No internet service'],palette='YlGnBu_r')
    #頻數(shù)柱形圖,x為每個(gè)特征,hue為區(qū)分是否流失,y為頻數(shù),order可以規(guī)定x內(nèi)顯示順序
    plt.xlabel(str(item))
    plt.title('Churn與'+str(item)+'的關(guān)系')
    i = i+1
plt.show()

image.png

上述可見(jiàn),網(wǎng)絡(luò)安全服務(wù)、在線備份業(yè)務(wù)、設(shè)備保護(hù)業(yè)務(wù)、技術(shù)支持服務(wù)、網(wǎng)絡(luò)電視和網(wǎng)絡(luò)電影這六個(gè)變量中沒(méi)有開(kāi)通網(wǎng)絡(luò)服務(wù)的用戶流失率相同的且較低,可能因?yàn)檫@六個(gè)變量只有在開(kāi)通網(wǎng)絡(luò)服務(wù)才會(huì)影響用戶決策。因此這六個(gè)變量不會(huì)對(duì)未使用網(wǎng)絡(luò)服務(wù)用戶的流失產(chǎn)生推論效應(yīng)。
在這六個(gè)變量中前四個(gè)變量“網(wǎng)絡(luò)安全服務(wù)、在線備份業(yè)務(wù)、設(shè)備保護(hù)業(yè)務(wù)、技術(shù)支持服務(wù)”未開(kāi)通該服務(wù)的用戶流失占比遠(yuǎn)高于開(kāi)通服務(wù)的流失占比,而“網(wǎng)絡(luò)電視和網(wǎng)絡(luò)電影”流失幾乎不受是否開(kāi)通該業(yè)務(wù)影響。猜測(cè)是因?yàn)榍八膫€(gè)變量開(kāi)通能提高用戶體驗(yàn)質(zhì)量減少流失,而“網(wǎng)絡(luò)電視和網(wǎng)絡(luò)電影”不夠成熟導(dǎo)致用戶體驗(yàn)變差反而造成流失。

2.45 合同與流失的關(guān)系
plt.title('合同類型與客戶流失的關(guān)系')
sns.barplot(x='Contract',y='Churn',data=df,order=['Month-to-month','One year','Two year'])
plt.ylabel('Churn:流失占比')
image.png

簽訂合同方式對(duì)流失率的影響是:按月>1年>2年

2.46 付款方式與流失的關(guān)系
#付款方式與流失的關(guān)系
plt.title('合同類型與客戶流失的關(guān)系')
sns.barplot(x='PaymentMethod',y='Churn',data=df,order=['Electronic check','Mailed check','Bank transfer (automatic)','Credit card (automatic)'])
plt.ylabel('Churn:流失占比')

image.png

從上圖可知,電子賬單的流失率最高,可見(jiàn)電子賬單的流程或設(shè)計(jì)影響用戶體驗(yàn),需要改進(jìn)。

3. 特征工程
3.1 特征篩選

根據(jù)上面的結(jié)論得知,變量gender 和 PhoneService對(duì)流失影響可忽略,刪除這兩列。customerID是隨機(jī)字符對(duì)后續(xù)建模不影響,也刪除。

df_new= df.iloc[:,2:20]
df_new.drop('PhoneService',inplace=True,axis=1)
df_id = df['customerID']#提取客戶ID

對(duì)用戶職位、總費(fèi)用、月費(fèi)用進(jìn)行連續(xù)變量歸一化,使方差為1均值為0,這樣預(yù)測(cè)數(shù)值不會(huì)被這些過(guò)大的特征值主導(dǎo)

from sklearn.preprocessing import StandardScaler
standard = StandardScaler()
standard.fit(df_new[['tenure','MonthlyCharges','TotalCharges']]

df_new[['tenure','MonthlyCharges','TotalCharges']] = standard.transform(df_new[['tenure','MonthlyCharges','TotalCharges']])
sns.boxplot(data=df_new[['tenure','MonthlyCharges','TotalCharges']])
plt.title('職位、月費(fèi)用和總費(fèi)用箱型圖可視化')
image.png

如果不進(jìn)行歸一化,得到的箱線圖是這樣的:


image.png

因此歸一化十分重要。
箱線圖中能夠看到,三個(gè)特征沒(méi)有異常數(shù)據(jù)。

3.2 處理對(duì)象類型數(shù)據(jù)
#查看對(duì)象類型都有哪些值
def uni(data):
    print(data,'--',df_new[data].unique())
dfobject = df_new.select_dtypes('object')
for i in range(0,len(dfobject.columns)):
    uni(dfobject.columns[i])
image.png

由上面分析可知,六個(gè)變量中沒(méi)有開(kāi)通網(wǎng)絡(luò)業(yè)務(wù)對(duì)流失影響較小,因此可以將No internet service 和 No 是一樣的效果,可以使用 No 替代 No internet service。

df_new.replace('No internet service','No',inplace=True)
df_new.replace('No phone service','No',inplace=True)
for i in range(0,len(dfobject.columns)):
    uni(dfobject.columns[i])
image.png
3.3 將數(shù)值進(jìn)行編碼

sklearn中的labelencoder進(jìn)行編碼

def labelend(data):
    df_new[data] = labelencoder.fit_transform(df_new[data])#labelencoder進(jìn)行編碼
for i in range(0,len(dfobject.columns)):
    labelend(dfobject.columns[i])
for i in range(0,len(dfobject.columns)):
    uni(dfobject.columns[i])
image.png
4. 構(gòu)造模型
4.1 交叉驗(yàn)證

由于流失占比不均衡,因此采用分層交叉驗(yàn)證法

from sklearn.model_selection import StratifiedShuffleSplit
X = df_new#刪除與流失無(wú)關(guān)的列,將對(duì)象類型進(jìn)行編碼,將數(shù)值較大列進(jìn)行歸一化后得到的特征集
y = df['Churn'].values#標(biāo)簽集
sss = StratifiedShuffleSplit(n_splits=5,test_size=0.2,random_state=0)
for train_index,test_index in sss.split(X,y):
    print('train',train_index,'test',test_index)#得到訓(xùn)練集和測(cè)試集的index
    X_train,X_test = X.iloc[train_index],X.iloc[test_index]#訓(xùn)練集特征,測(cè)試集特征
    y_train,y_test = y[train_index],y[test_index]#訓(xùn)練集標(biāo)簽,測(cè)試集標(biāo)簽
    
image.png
print('原始數(shù)據(jù)特征',X.shape)
print('訓(xùn)練數(shù)據(jù)特征',X_train.shape)
print('測(cè)試數(shù)據(jù)特征',X_test.shape)
image.png
print('原始數(shù)據(jù)標(biāo)簽',y.shape)
print('訓(xùn)練數(shù)據(jù)標(biāo)簽',y_train.shape)
print('測(cè)試數(shù)據(jù)標(biāo)簽',y_test.shape)
image.png
4.2 選擇機(jī)器學(xué)習(xí)算法

由于這里是監(jiān)督學(xué)習(xí)分類問(wèn)題,可選算法有:SVM支持向量機(jī),決策樹(shù),樸素貝葉斯,邏輯回歸(當(dāng)然其他還有很多,比如隨機(jī)森林、KNN、xgboost、catboost等,但是暫時(shí)沒(méi)有掌握)

#算法
from sklearn.svm import SVC #支持向量機(jī)
from sklearn.linear_model import LogisticRegression #邏輯回歸
from sklearn.naive_bayes import GaussianNB#樸素貝葉斯
from sklearn.tree import DecisionTreeClassifier#決策樹(shù)分類器

from sklearn.metrics import recall_score,f1_score,precision_score
Classifiers = [['SVM',SVC()],
              ['LogisticRegression',LogisticRegression()],
              ['GaussianNB',GaussianNB()],
              ['DecisionTreeClassifier',DecisionTreeClassifier()]]
Classify_results = []
names = []
prediction = []
for name ,classifier in Classifiers:
    classifier.fit(X_train,y_train)#訓(xùn)練這4個(gè)模型
    y_pred = classifier.predict(X_test)#預(yù)測(cè)這4個(gè)模型
    recall = recall_score(y_test,y_pred)#評(píng)估這四個(gè)模型的召回率
    precision = precision_score(y_test,y_pred)#評(píng)估這四個(gè)模型的精確率
    f1 = f1_score(y_test,y_pred)#評(píng)估這四個(gè)模型的f1分?jǐn)?shù)
    class_eva = pd.DataFrame([recall,precision,f1])#將召回率、精確率和f1分?jǐn)?shù)放在df中,方便接下來(lái)對(duì)比
    Classify_results.append(class_eva)
    name = pd.Series(name)
    names.append(name)
    y_pred = pd.DataFrame(y_pred)
    prediction.append(y_pred)

將得到的模型評(píng)估指標(biāo)制作成表格

names = pd.DataFrame(names)
result = pd.concat(Classify_results,axis=1)
result.columns = names
result.index=[['recall','precision','f1']]
result

image.png

綜上所述,樸素貝葉斯模型的f1分?jǐn)?shù)最高,因此使用樸素貝葉斯效果最好。

5. 實(shí)施方案

由于沒(méi)有給預(yù)測(cè)數(shù)據(jù),這里選擇最后10行數(shù)據(jù)作為預(yù)測(cè)

df_test = df_new.tail(10)#截取數(shù)據(jù)最后10行
cutid_test = df['customerID'].tail(10)#取出最后10行的ID
model = GaussianNB()
model.fit(X_train,y_train)#訓(xùn)練
pred_test_y = model.predict(df_test)#用最后10行的數(shù)據(jù)做預(yù)測(cè)
predf = pd.DataFrame({'customerID':cutid_test,'churn':pred_test_y})

image.png

對(duì)比了實(shí)際數(shù)據(jù),返現(xiàn)10行中3行預(yù)測(cè)錯(cuò)誤,其余正確,與f1score=63%相符。

6. 結(jié)論

通過(guò)上述分析

  • 老年用戶、單身、經(jīng)濟(jì)未獨(dú)立的用戶流失率較高;
  • 是否開(kāi)通電話服務(wù)對(duì)用戶流失沒(méi)有直接的影響;
  • 提供的網(wǎng)絡(luò)服務(wù)如:網(wǎng)絡(luò)安全服務(wù)、在線備份業(yè)務(wù)、設(shè)備保護(hù)業(yè)務(wù)、技術(shù)支持服務(wù)能夠降低用戶的流失率
  • 合同簽訂時(shí)間越久留存越高
  • 使用電子賬單付款的用戶更容易流失
    針對(duì)以上結(jié)論,給出的建議是:
    (1)推薦老年用戶與青少年用戶采用數(shù)字網(wǎng)絡(luò),且簽訂2年期合同(可以各種輔助優(yōu)惠等營(yíng)銷手段來(lái)提高2年期合同的簽訂率)
    (2)若能開(kāi)通相關(guān)網(wǎng)絡(luò)服務(wù)可增加用戶粘性,因此可增加這塊業(yè)務(wù)的推廣
    (3)考慮改善電子賬單支付的用戶體驗(yàn)。

參考:
https://mp.weixin.qq.com/s/_20MN6V6aV1T3Ekd7C9neQ 李啟方大佬
https://blog.csdn.net/u013385925/article/details/80142310onehot
https://blog.csdn.net/Li_yi_chao/article/details/80852701onehot
https://blog.csdn.net/ccblogger/article/details/80010974
https://blog.csdn.net/u010986753/article/details/98069124交叉驗(yàn)證
https://blog.csdn.net/wuzhongqiang/article/details/101560889分層交叉驗(yàn)證詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容