成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你用Python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

開(kāi)發(fā) 前端
今天教大家如何用Python寫(xiě)一個(gè)電信用戶流失預(yù)測(cè)模型。之前我們用Python寫(xiě)了員工流失預(yù)測(cè)模型,這次我們?cè)囋嘝ython預(yù)測(cè)電信用戶的流失。

 【導(dǎo)讀】

今天教大家如何用Python寫(xiě)一個(gè)電信用戶流失預(yù)測(cè)模型。之前我們用Python寫(xiě)了員工流失預(yù)測(cè)模型,這次我們?cè)囋嘝ython預(yù)測(cè)電信用戶的流失。

01、商業(yè)理解

流失客戶是指那些曾經(jīng)使用過(guò)產(chǎn)品或服務(wù),由于對(duì)產(chǎn)品失去興趣等種種原因,不再使用產(chǎn)品或服務(wù)的顧客。

電信服務(wù)公司、互聯(lián)網(wǎng)服務(wù)提供商、保險(xiǎn)公司等經(jīng)常使用客戶流失分析和客戶流失率作為他們的關(guān)鍵業(yè)務(wù)指標(biāo)之一,因?yàn)榱糇∫粋€(gè)老客戶的成本遠(yuǎn)遠(yuǎn)低于獲得一個(gè)新客戶。

預(yù)測(cè)分析使用客戶流失預(yù)測(cè)模型,通過(guò)評(píng)估客戶流失的風(fēng)險(xiǎn)傾向來(lái)預(yù)測(cè)客戶流失。由于這些模型生成了一個(gè)流失概率排序名單,對(duì)于潛在的高概率流失客戶,他們可以有效地實(shí)施客戶保留營(yíng)銷(xiāo)計(jì)劃。

下面我們就教你如何用Python寫(xiě)一個(gè)電信用戶流失預(yù)測(cè)模型,以下是具體步驟和關(guān)鍵代碼。

02、數(shù)據(jù)理解

此次分析數(shù)據(jù)來(lái)自于IBM Sample Data Sets,統(tǒng)計(jì)自某電信公司一段時(shí)間內(nèi)的消費(fèi)數(shù)據(jù)。共有7043筆客戶資料,每筆客戶資料包含21個(gè)字段,其中1個(gè)客戶ID字段,19個(gè)輸入字段及1個(gè)目標(biāo)字段-Churn(Yes代表流失,No代表未流失),輸入字段主要包含以下三個(gè)維度指標(biāo):用戶畫(huà)像指標(biāo)、消費(fèi)產(chǎn)品指標(biāo)、消費(fèi)信息指標(biāo)。字段的具體說(shuō)明如下:

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

03、數(shù)據(jù)讀入和概覽

首先導(dǎo)入所需包。

  1. df = pd.read_csv('./Telco-Customer-Churn.csv'
  2. df.head()   

讀入數(shù)據(jù)集

  1. df = pd.read_csv('./Telco-Customer-Churn.csv'
  2. df.head()   
實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

04、數(shù)據(jù)初步清洗

首先進(jìn)行初步的數(shù)據(jù)清洗工作,包含錯(cuò)誤值和異常值處理,并劃分類別型和數(shù)值型字段類型,其中清洗部分包含:

  • OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies:錯(cuò)誤值處理
  • TotalCharges:異常值處理
  • tenure:自定義分箱
  • 定義類別型和數(shù)值型字段
  1. # 錯(cuò)誤值處理 
  2. repl_columns = ['OnlineSecurity''OnlineBackup''DeviceProtection',  
  3.                 'TechSupport','StreamingTV''StreamingMovies'
  4.  
  5. for i in repl_columns: 
  6.     df[i]  = df[i].replace({'No internet service' : 'No'})  
  7.  
  8. # 替換值SeniorCitizen 
  9. df["SeniorCitizen"] = df["SeniorCitizen"].replace({1"Yes"0"No"})  
  10.  
  11. # 替換值TotalCharges 
  12. df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan)  
  13.  
  14. # TotalCharges空值:數(shù)據(jù)量小,直接刪除 
  15. df = df.dropna(subset=['TotalCharges'])  
  16. df.reset_index(drop=True, inplace=True)  # 重置索引 
  17.  
  18. # 轉(zhuǎn)換數(shù)據(jù)類型 
  19. df['TotalCharges'] = df['TotalCharges'].astype('float'
  20.  
  21. # 轉(zhuǎn)換tenure 
  22. def transform_tenure(x): 
  23.     if x <= 12
  24.         return 'Tenure_1' 
  25.     elif x <= 24
  26.         return 'Tenure_2' 
  27.     elif x <= 36
  28.         return 'Tenure_3' 
  29.     elif x <= 48
  30.         return 'Tenure_4' 
  31.     elif x <= 60
  32.         return 'Tenure_5' 
  33.     else
  34.         return 'Tenure_over_5'  
  35.  
  36. df['tenure_group'] = df.tenure.apply(transform_tenure) 
  37.  
  38. # 數(shù)值型和類別型字段 
  39. Id_col = ['customerID'
  40. target_col = ['Churn'
  41.  
  42. cat_cols = df.nunique()[df.nunique() < 10].index.tolist()  
  43. num_cols = [i for i in df.columns if i not in cat_cols + Id_col]  
  44.  
  45. print('類別型字段:\n', cat_cols) 
  46. print('-' * 30)  
  47. print('數(shù)值型字段:\n', num_cols) 
  1. 類別型字段: 
  2.  ['gender''SeniorCitizen''Partner''Dependents''PhoneService',  
  3.   'MultipleLines''InternetService''OnlineSecurity'
  4.   'OnlineBackup''DeviceProtection''TechSupport'
  5.   'StreamingTV''StreamingMovies''Contract''PaperlessBilling',  
  6.   'PaymentMethod''Churn''tenure_group'
  7. ------------------------------ 
  8. 數(shù)值型字段: 
  9.  ['tenure''MonthlyCharges''TotalCharges'

05、探索性分析

對(duì)指標(biāo)進(jìn)行歸納梳理,分用戶畫(huà)像指標(biāo),消費(fèi)產(chǎn)品指標(biāo),消費(fèi)信息指標(biāo)。探索影響用戶流失的關(guān)鍵因素。

1. 目標(biāo)變量Churn分布

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

經(jīng)過(guò)初步清洗之后的數(shù)據(jù)集大小為7032條記錄,其中流失客戶為1869條,占比26.6%,未流失客戶占比73.4%。

  1. df['Churn'].value_counts()  
  2. No     5163 
  3. Yes    1869 
  4. Name: Churn, dtype: int64 
  1. trace0 = go.Pie(labels=df['Churn'].value_counts().index,  
  2.                 values=df['Churn'].value_counts().values, 
  3.                 hole=.5
  4.                 rotation=90
  5.                 marker=dict(colors=['rgb(154,203,228)''rgb(191,76,81)'],  
  6.                             line=dict(color='white', width=1.3)) 
  7.                ) 
  8. data = [trace0]  
  9. layout = go.Layout(title='目標(biāo)變量Churn分布'
  10.  
  11. fig = go.Figure(data=data, layout=layout) 
  12. py.offline.plot(fig, filename='./html/整體流失情況分布.html'

2.性別

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

分析可見(jiàn),男性和女性在客戶流失比例上沒(méi)有顯著差異。

  1. plot_bar(input_col='gender', target_col='Churn', title_name='性別與是否流失的關(guān)系')  

3. 老年用戶

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

老年用戶流失比例更高,為41.68%,比非老年用戶高近兩倍,此部分原因有待進(jìn)一步探討。

  1. plot_bar(input_col='SeniorCitizen', target_col='Churn', title_name='老年用戶與是否流失的關(guān)系')  

4. 是否有配偶

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

從婚姻情況來(lái)看,數(shù)據(jù)顯示,未婚人群中流失的比例比已婚人數(shù)高出13%。

  1. plot_bar(input_col='Partner', target_col='Churn', title_name='是否有配偶與是否流失的關(guān)系')  

5. 上網(wǎng)時(shí)長(zhǎng)

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

經(jīng)過(guò)分析,這方面可以得出兩個(gè)結(jié)論:

  • 用戶的在網(wǎng)時(shí)長(zhǎng)越長(zhǎng),表示用戶的忠誠(chéng)度越高,其流失的概率越低;
  • 新用戶在1年內(nèi)的流失率顯著高于整體流失率,為47.68%。
  1. plot_bar(input_col='tenure_group', target_col='Churn', title_name='在網(wǎng)時(shí)長(zhǎng)與是否流失的關(guān)系')  

6. 付款方式

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

支付方式上,支付上,選擇電子支票支付方式的用戶流失最高,達(dá)到45.29%,其他三種支付方式的流失率相差不大。

  1. pd.crosstab(df['PaymentMethod'], df['Churn'])  
實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

 

  1. plot_bar(input_col='PaymentMethod', target_col='Churn', title_name='付款方式與是否流失關(guān)系')  

7. 月費(fèi)用

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

整體來(lái)看,隨著月費(fèi)用的增加,流失用戶的比例呈現(xiàn)高高低低的變化,月消費(fèi)80-100元的用戶相對(duì)較高。

  1. plot_histogram(input_col='MonthlyCharges', title_name='月費(fèi)用與是否流失關(guān)系'

8. 數(shù)值型屬性相關(guān)性

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

從相關(guān)性矩陣圖可以看出,用戶的往來(lái)期間和總費(fèi)用呈現(xiàn)高度相關(guān),往來(lái)期間越長(zhǎng),則總費(fèi)用越高。月消費(fèi)和總消費(fèi)呈現(xiàn)顯著相關(guān)。

  1. plt.figure(figsize=(1510))   
  2. sns.heatmap(df.corr(), linewidths=0.1, cmap='tab20c_r', annot=True) 
  3. plt.title('數(shù)值型屬性的相關(guān)性', fontdict={'fontsize''xx-large''fontweight':'heavy'})  
  4. plt.xticks(fontsize=12
  5. plt.yticks(fontsize=12
  6. plt.show()  

06、特征選擇

使用統(tǒng)計(jì)檢定方式進(jìn)行特征篩選。

  1. # 刪除tenure 
  2. df = df.drop('tenure', axis=1)  
  3.  
  4. from feature_selection import Feature_select 
  5.  
  6. # 劃分X和y 
  7. X = df.drop(['customerID''Churn'], axis=1)  
  8. y = df['Churn']    
  9.  
  10. fs = Feature_select(num_method='anova', cate_method='kf', pos_label='Yes'
  11. x_sel = fs.fit_transform(X, y)   
  1. 2020 09:30:02 INFO attr select success! 
  2. After select attr: ['DeviceProtection''MultipleLines''OnlineSecurity',  
  3.                     'TechSupport''tenure_group''PaperlessBilling'
  4.                     'InternetService''PaymentMethod''SeniorCitizen',  
  5.                     'MonthlyCharges''Dependents''Partner''Contract',  
  6.                     'StreamingTV''TotalCharges''StreamingMovies''OnlineBackup'

經(jīng)過(guò)特征篩選,gender和PhoneService字段被去掉。

07、建模前處理

在python中,為滿足建模需要,一般需要對(duì)數(shù)據(jù)做以下處理:

  • 對(duì)于二分類變量,編碼為0和1;
  • 對(duì)于多分類變量,進(jìn)行one_hot編碼;
  • 對(duì)于數(shù)值型變量,部分模型如KNN、神經(jīng)網(wǎng)絡(luò)、Logistic需要進(jìn)行標(biāo)準(zhǔn)化處理。
  1. # 篩選變量 
  2. select_features = x_sel.columns 
  3.  
  4. # 建模數(shù)據(jù) 
  5. df_model = pd.concat([df['customerID'], df[select_features], df['Churn']], axis=1
  6.  
  7. Id_col = ['customerID'
  8. target_col = ['Churn'
  9.  
  10. # 分類型 
  11. cat_cols = df_model.nunique()[df_model.nunique() < 10].index.tolist()  
  12. # 二分類屬性 
  13. binary_cols = df_model.nunique()[df_model.nunique() == 2].index.tolist() 
  14. # 多分類屬性 
  15. multi_cols = [i for i in cat_cols if i not in binary_cols]  
  16.  
  17. # 數(shù)值型 
  18. num_cols = [i for i in df_model.columns if i not in cat_cols + Id_col]  
  19.  
  20. # 二分類-標(biāo)簽編碼 
  21. le = LabelEncoder() 
  22.  
  23. for i in binary_cols: 
  24.     df_model[i] = le.fit_transform(df_model[i])  
  25.  
  26. # 多分類-啞變量轉(zhuǎn)換 
  27. df_model = pd.get_dummies(data=df_model, columns=multi_cols)  
  28. df_model.head()  
實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

08、模型建立和評(píng)估

首先使用分層抽樣的方式將數(shù)據(jù)劃分訓(xùn)練集和測(cè)試集。

  1. # 重新劃分 
  2. X = df_model.drop(['customerID''Churn'], axis=1)  
  3. y = df_model['Churn']   
  4.  
  5. # 分層抽樣 
  6. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)  
  7. print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)  
  8.  
  9. #修正索引 
  10. for i in [X_train, X_test, y_train, y_test]: 
  11.     i.index = range(i.shape[0])  
  1. (562531) (140731) (5625,) (1407,) 
  1. # 保存標(biāo)準(zhǔn)化訓(xùn)練和測(cè)試數(shù)據(jù) 
  2. st = StandardScaler() 
  3. num_scaled_train = pd.DataFrame(st.fit_transform(X_train[num_cols]), columns=num_cols) 
  4. num_scaled_test = pd.DataFrame(st.transform(X_test[num_cols]), columns=num_cols)  
  5.  
  6. X_train_sclaed = pd.concat([X_train.drop(num_cols, axis=1), num_scaled_train], axis=1
  7. X_test_sclaed = pd.concat([X_test.drop(num_cols, axis=1), num_scaled_test], axis=1)  

然后建立一系列基準(zhǔn)模型并比較效果。

實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

假如我們關(guān)注roc指標(biāo),從模型表現(xiàn)效果來(lái)看,Naive Bayes效果最好。我們也可以對(duì)模型進(jìn)行進(jìn)一步優(yōu)化,比如對(duì)決策樹(shù)參數(shù)進(jìn)行調(diào)優(yōu)。

  1. parameters = {'splitter': ('best','random'), 
  2.               'criterion': ("gini","entropy"), 
  3.               "max_depth": [*range(320)], 
  4.              } 
  5.  
  6. clf = DecisionTreeClassifier(random_state=25
  7. GS = GridSearchCV(clf, parameters, scoring='f1', cv=10
  8. GS.fit(X_train, y_train) 
  9.  
  10. print(GS.best_params_)  
  11.  
  12. print(GS.best_score_)  
  1. {'criterion''entropy''max_depth'5'splitter''best'
  2. 0.585900839405024 
  1. clf = GS.best_estimator_ 
  2.  
  3. test_pred = clf.predict(X_test) 
  4. print('測(cè)試集:\n', classification_report(y_test, test_pred))  
  1. 測(cè)試集: 
  2.                precision    recall  f1-score   support 
  3.  
  4.            0       0.86      0.86      0.86      1033 
  5.            1       0.61      0.61      0.61       374 
  6.  
  7.     accuracy                           0.79      1407 
  8.    macro avg       0.73      0.73      0.73      1407 
  9. weighted avg       0.79      0.79      0.79      1407 

將這棵樹(shù)繪制出來(lái)。

  1. import graphviz 
  2. dot_data = tree.export_graphviz(decision_tree=clf, max_depth=3
  3.                                  out_file=None,  
  4.                                  feature_names=X_train.columns, 
  5.                                  class_names=['not_churn''churn'],  
  6.                                  filled=True, 
  7.                                  rounded=True 
  8.                                 ) 
  9. graph = graphviz.Source(dot_data)  
實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

輸出決策樹(shù)屬性重要性排序:

  1. imp = pd.DataFrame(zip(X_train.columns, clf.feature_importances_)) 
  2. imp.columns = ['feature''importances'
  3. imp = imp.sort_values('importances', ascending=False) 
  4. imp = imp[imp['importances'] != 0
  5.  
  6. table  = ff.create_table(np.round(imp, 4)) 
  7. py.offline.iplot(table)   
實(shí)例 | 教你用python寫(xiě)一個(gè)電信客戶流失預(yù)測(cè)模型

后續(xù)優(yōu)化方向:

  • 數(shù)據(jù):分類技術(shù)應(yīng)用在目標(biāo)類別分布越均勻的數(shù)據(jù)集時(shí),其所建立之分類器通常會(huì)有比較好的分類效能。針對(duì)數(shù)據(jù)在目標(biāo)字段上分布不平衡,可采用過(guò)采樣和欠采樣來(lái)處理類別不平衡問(wèn)題;
  • 屬性:進(jìn)一步屬性篩選方法和屬性組合;
  • 算法:參數(shù)調(diào)優(yōu);調(diào)整預(yù)測(cè)門(mén)檻值來(lái)增加預(yù)測(cè)效能。

 

責(zé)任編輯:張燕妮 來(lái)源: 今日頭條
相關(guān)推薦

2020-09-15 14:05:21

Python代碼預(yù)測(cè)模型

2016-12-22 10:00:18

KNIME流失模型

2022-02-18 10:34:19

邏輯回歸KNN預(yù)測(cè)

2022-01-06 18:20:20

Scarlet AndroidWebSocket

2020-05-09 09:59:52

Python數(shù)據(jù)土星

2022-06-28 12:35:21

DockerPython

2022-08-01 11:50:47

PySpark流失預(yù)測(cè)模型

2021-05-18 14:42:55

PythonMySQL

2019-01-24 09:00:00

PythonAutoML機(jī)器學(xué)習(xí)

2020-03-25 14:40:45

語(yǔ)言編程語(yǔ)言Hello

2021-07-12 09:03:50

Python任務(wù)管理器cmd命令

2021-06-23 16:40:58

JavaTomcatWeb

2015-03-23 12:33:28

2015-04-22 11:29:45

PythonPython創(chuàng)建瀑布圖

2023-08-03 08:51:07

2022-02-25 09:41:05

python搜索引擎

2021-08-24 10:02:21

JavaScript網(wǎng)頁(yè)搜索 前端

2024-11-05 16:40:24

JavaScript搜索引擎

2021-05-13 20:20:40

Java架構(gòu)代碼

2018-10-31 10:11:24

Python編程語(yǔ)言語(yǔ)音播放
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费成人在线网站 | 久久国产区| 免费观看a级毛片在线播放 黄网站免费入口 | 97久久精品午夜一区二区 | 亚洲精品久久久久久久久久久久久 | 青青草原综合久久大伊人精品 | 亚洲中国字幕 | 国产成人精品一区二区三区在线 | 久久精品视频免费观看 | 国产成人高清成人av片在线看 | 日韩av免费在线电影 | 国产免费拔擦拔擦8x高清 | 欧美综合一区 | 久久亚洲国产精品日日av夜夜 | 久久99精品久久久久子伦 | 日韩精品免费一区二区在线观看 | 久久久久久亚洲精品 | 中文字幕 在线观看 | av黄色网 | 一区二区日本 | 亚洲 中文 欧美 日韩 在线观看 | 久久乐国产精品 | 久久美女网 | 精品伦精品一区二区三区视频 | 精品国产视频在线观看 | 欧美日韩精品久久久免费观看 | 涩涩视频在线看 | 国产情品| 精品国产免费人成在线观看 | 天堂视频中文在线 | 神马九九 | 成人午夜免费福利视频 | 激情综合五月 | 成人乱人乱一区二区三区软件 | 在线观看国产视频 | 欧美电影一区 | 国产精品亚洲精品 | 一区二区三区在线免费观看视频 | 国产精品久久久久久久免费观看 | 99视频在线免费观看 | 国产福利视频在线观看 |