
隨着大數據的時代的來臨,各個行業都受到了數據分析不同程度的影響和作用。尤其是在電信行業,數據分析已經逐漸成為電信運營商的戰略優勢之一。
大家好,我是一名CDA持證人,今天想跟大家分享一下,我如何從文科生轉行成為了一名電信行業的數據挖掘工程師。
主要內容分成以下三塊:
第一部分我作為文科生轉行數據挖掘的歷程;
第二部分關於目前從事數據挖掘,主要針對商業數據挖掘所需要掌握的一些技能;
第三部分案例分享:數據分析思維如何應用到電信行業,電信用戶流失預測模型
文科生轉行數據挖掘工程師的歷程
首先看到第一部分的內容,也就是我的轉行歷程。
我高中那會兒讀的是文科,大學期間學習了社會學專業。在本科期間,我也接觸過一些統計學的知識,線性代數等知識也學過,但當時對這些學科將來的用途並不是很清楚。
參加工作後,最初我從事產品運營的相關工作。在工作過程中,我接觸到了數據分析相關的內容。當時我感覺自己工作內容比較雜,也沒有拿得出來的技能。
我認為數據分析很有前景,無論是文科生還是理科生都可以學,學起來也比較有趣,內容不枯燥,所以我漸漸開始學習數據分析。
這裡我列了幾個對我比較關鍵的節點,這些對我未來的工作有了較大的影響。

首先就是學數據挖掘,用的是SPSS Modeler。比較容易上手,入門也比較簡單。SPSS Modeler雖然很好用,但其實很多時候不能滿足數據清洗的一些需求,也有一些劣勢,比如算法更新很慢,只有比較常規的算法,如果想用比較先進的算法,還是開源的軟件提供的比較多。
之後我學習了Python,比較容易上手,語法也比較簡潔。通過大量練習掌握了爬蟲、數據清洗、數據可視化等技能點。Python基本能滿足日常工作的需求。
第三個節點是我學習了SQL和統計知識。SQL本身基礎的知識不是特別複雜,然後主要靠練習,包括統計的一些知識,這也是我在之後的工作中不斷學習的。
掃碼領取學習資料
掌握數據分析技能
從事數據挖掘技能需求
目前我目前從事的是數據挖掘的相關工作,接下來講一下工作中所需要的一些技能。

這部分可以分為硬技能和軟技能。
硬技能這裡我分為理論基礎、算法能力、分析工具和通用工具。下面具體來看一看。理論基礎中統計知識是不可或缺的。後面的概率論、線性代數、微積分其實是跟偏算法相關。
算法方面主要需要一些機器學習跟深度學習的算法。比如分類、回歸、聚類等一些比較基礎的算法。
不同於算法工程師對算法的要求會比較高,像偏業務的數據挖掘的崗位,對算法的要求沒那麼高。你能夠做到理解算法的基本原理跟應用場景,能夠應用工具去實現它,能夠解讀算法最後的結果,也就差不多了,對數學的要求也並不太高。
關於深度學習,現在數據挖掘等算法崗也相對內卷,如果你不會也不了解深度學習就有點說不過去了,這方面可以了解一下。還需要掌握一些工具庫,現在深度學習的工具庫比較多,也有一些比較簡便的工具庫能協助實現相關的功能。
然後看到分析工具。其實目前主要用的也就是SQL跟Python,主要是看你公司的數據量,如果數據量不是很大的話,基礎的一些SQL知識就夠了,可能關係數據庫就可以了,包括在單機裡面,去運行Python也可以的;但是如果公司的數據量特別大的話,比如我目前是在Hadoop的平台做一些數據分析跟數據挖掘。如果本身的數據量就比較大,可能會用到Hive數據倉庫等。
再看到建模工具,目前其實主流是Python,還有集成了Pyspark,這是用得比較多的。然後建模的話,考慮到數據量Python在80%的情況上都是夠用的。
關於通用工具,Excel跟PPT都是比較基礎的。下面這個Shell是開發工具,很多時候會涉及到一些開發的工作,比如說標籤表的開發,然後就會用到Shell結合ETL自動化平台,調用需要的腳本進行自動化的運行。就相當於是每天它會自動的跑一些腳本,而不需要去手工或者是在單機操作,這些都是在平台上面自動完成的。
軟技能這塊簡單看一下,包括像業務的理解,比如你進入任何一個行業,你前幾個月會多花時間了解該行業的業務表,業務涉及的一些內容,核心的盈利業務是哪些。還有一些通用的能力,比如溝通、匯報能力等,因為你經常會需要將模型和分析報告講給別人聽,因此這些能力也是十分重要的。還有學習能力。數據行業的迭代比較快,需要有持續學習的能力。
掃碼領取學習資料
掌握數據分析技能
數據分析項目實操
用Python創建電信客戶流失模型
下面我們再來看一下數據分析在電信行業的應用,目前國內運營商運用大數據主要有五方面:
(1)網絡管理和優化,包括基礎設施建設優化和網絡運營管理和優化;
(2)市場與精準營銷,包括客戶畫像、關係鏈研究、精準營銷、實時營銷和個性化推薦;
(3)客戶關係管理,包括客服中心優化和客戶生命周期管理;
(4)企業運營管理,包括業務運營監控和經營分析;
(5)數據商業化指數據對外商業化。
接下來,今天給大家演示一下,把數據分析應用到電信行業的具體案例,這裡教大家用Python寫一個電信用戶流失預測模型。
流失客戶是指那些曾經使用過產品或服務,由於對產品失去興趣等種種原因,不再使用產品或服務的顧客。
電信服務公司、互聯網服務提供商、保險公司等經常使用客戶流失分析和客戶流失率作為他們的關鍵業務指標之一,因為留住一個老客戶的成本遠遠低於獲得一個新客戶。
預測分析使用客戶流失預測模型,通過評估客戶流失的風險傾向來預測客戶流失。由於這些模型生成了一個流失概率排序名單,對於潛在的高概率流失客戶,他們可以有效地實施客戶保留營銷計劃。
下面我們就教你如何用Python寫一個電信用戶流失預測模型,以下是具體步驟和關鍵代碼。
數據理解
此次分析數據來自於IBM Sample Data Sets,統計自某電信公司一段時間內的消費數據。共有7043筆客戶資料,每筆客戶資料包含21個字段,其中1個客戶ID字段,19個輸入字段及1個目標字段-Churn(Yes代表流失,No代表未流失),輸入字段主要包含以下三個維度指標:用戶畫像指標、消費產品指標、消費信息指標。字段的具體說明如下:

掃碼領取學習資料
掌握數據分析技能
數據讀入和概覽
首先導入所需包。
#數據處理importnumpyasnpimportpandasaspd#可視化importmatplotlib.pyplotaspltimportseabornassnsimportplotlyaspyimportplotly.graph_objsasgoimportplotly.figure_factoryasff#前處理fromsklearn.preprocessingimportLabelEncoderfromsklearn.preprocessingimportStandardScaler#建模fromsklearn.linear_modelimportLogisticRegressionfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.treeimportDecisionTreeClassifierfromsklearnimporttreefromsklearn.ensembleimportRandomForestClassifierfromsklearn.naive_bayesimportGaussianNBfromsklearn.neural_networkimportMLPClassifierfromsklearn.svmimportSVCfromlightgbmimportLGBMClassifierfromxgboostimportXGBClassifier#模型評估fromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn.metricsimportconfusion_matrix,accuracy_score,classification_reportfromsklearn.metricsimportroc_auc_score,roc_curve,scorerfromsklearn.metricsimportrecall_score,precision_score,f1_score,cohen_kappa_scorepd.set_option('display.max_columns',None)讀入數據集
df=pd.read_csv('./Telco-Customer-Churn.csv')df.head()
數據初步清洗
首先進行初步的數據清洗工作,包含錯誤值和異常值處理,並劃分類別型和數值型字段類型,其中清洗部分包含:
OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies:錯誤值處理#錯誤值處理repl_columns=['OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','StreamingTV','StreamingMovies']foriinrepl_columns:df[i]=df[i].replace({'Nointernetservice':'No'})#替換值SeniorCitizendf["SeniorCitizen"]=df["SeniorCitizen"].replace({1:"Yes",0:"No"})#替換值TotalChargesdf['TotalCharges']=df['TotalCharges'].replace('',np.nan)# TotalCharges空值:數據量小,直接刪除df=df.dropna(subset=['TotalCharges'])df.reset_index(drop=True,inplace=True)#重置索引#轉換數據類型df['TotalCharges']=df['TotalCharges'].astype('float')#轉換tenuredeftransform_tenure(x):ifx<=12:return'Tenure_1'elifx<=24:return'Tenure_2'elifx<=36:return'Tenure_3'elifx<=48:return'Tenure_4'elifx<=60:return'Tenure_5'else:return'Tenure_over_5'df['tenure_group']=df.tenure.apply(transform_tenure)#數值型和類別型字段Id_col=['customerID']target_col=['Churn']cat_cols=df.nunique()[df.nunique()<10].index.tolist()num_cols=[iforiindf.columnsifinotincat_cols+Id_col]print('類別型字段:\n',cat_cols)print('-'*30)print('數值型字段:\n',num_cols)類別型字段:['gender','SeniorCitizen','Partner','Dependents','PhoneService','MultipleLines','InternetService','OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','StreamingTV','StreamingMovies','Contract','PaperlessBilling','PaymentMethod','Churn','tenure_group']------------------------------數值型字段:['tenure','MonthlyCharges','TotalCharges']
探索性分析
對指標進行歸納梳理,分用戶畫像指標,消費產品指標,消費信息指標。探索影響用戶流失的關鍵因素。
1. 目標變量Churn分布

經過初步清洗之後的數據集大小為7032條記錄,其中流失客戶為1869條,占比26.6%,未流失客戶占比73.4%。
df['Churn'].value_counts()No5163Yes1869Name:Churn,dtype:int64trace0=go.Pie(labels=df['Churn'].value_counts().index,values=df['Churn'].value_counts().values,hole=.5,rotation=90,marker=dict(colors=['rgb(154,203,228)','rgb(191,76,81)'],line=dict(color='white',width=1.3)))data=[trace0]layout=go.Layout(title='目標變量Churn分布')fig=go.Figure(data=data,layout=layout)py.offline.plot(fig,filename='./html/整體流失情況分布.html')2.性別

分析可見,男性和女性在客戶流失比例上沒有顯著差異。
plot_bar(input_col='gender',target_col='Churn',title_name='性別與是否流失的關係')3. 老年用戶

老年用戶流失比例更高,為41.68%,比非老年用戶高近兩倍,此部分原因有待進一步探討。
plot_bar(input_col='SeniorCitizen',target_col='Churn',title_name='老年用戶與是否流失的關係')4. 是否有配偶

從婚姻情況來看,數據顯示,未婚人群中流失的比例比已婚人數高出13%。
plot_bar(input_col='Partner',target_col='Churn',title_name='是否有配偶與是否流失的關係')5. 上網時長

經過分析,這方面可以得出兩個結論:
用戶的在網時長越長,表示用戶的忠誠度越高,其流失的概率越低;
新用戶在1年內的流失率顯著高於整體流失率,為47.68%。
plot_bar(input_col='tenure_group',target_col='Churn',title_name='在網時長與是否流失的關係')6. 付款方式

支付方式上,支付上,選擇電子支票支付方式的用戶流失最高,達到45.29%,其他三種支付方式的流失率相差不大。
pd.crosstab(df['PaymentMethod'],df['Churn'])
plot_bar(input_col='PaymentMethod',target_col='Churn',title_name='付款方式與是否流失關係')7. 月費用

整體來看,隨着月費用的增加,流失用戶的比例呈現高高低低的變化,月消費80-100元的用戶相對較高。
plot_histogram(input_col='MonthlyCharges',title_name='月費用與是否流失關係')8. 數值型屬性相關性

從相關性矩陣圖可以看出,用戶的往來期間和總費用呈現高度相關,往來期間越長,則總費用越高。月消費和總消費呈現顯著相關。
plt.figure(figsize=(15,10))sns.heatmap(df.corr(),linewidths=0.1,cmap='tab20c_r',annot=True)plt.title('數值型屬性的相關性',fontdict={'fontsize':'xx-large','fontweight':'heavy'})plt.xticks(fontsize=12)plt.yticks(fontsize=12)plt.show()特徵選擇
使用統計檢定方式進行特徵篩選。
#刪除tenuredf=df.drop('tenure',axis=1)fromfeature_selectionimportFeature_select#劃分X和yX=df.drop(['customerID','Churn'],axis=1)y=df['Churn']fs=Feature_select(num_method='anova',cate_method='kf',pos_label='Yes')x_sel=fs.fit_transform(X,y)202009:30:02INFOattrselectsuccess!Afterselectattr:['DeviceProtection','MultipleLines','OnlineSecurity','TechSupport','tenure_group','PaperlessBilling','InternetService','PaymentMethod','SeniorCitizen','MonthlyCharges','Dependents','Partner','Contract','StreamingTV','TotalCharges','StreamingMovies','OnlineBackup']經過特徵篩選,gender和PhoneService字段被去掉。
建模前處理
在python中,為滿足建模需要,一般需要對數據做以下處理:
對於二分類變量,編碼為0和1;
對於多分類變量,進行one_hot編碼;
對於數值型變量,部分模型如KNN、神經網絡、Logistic需要進行標準化處理。
#篩選變量select_features=x_sel.columns#建模數據df_model=pd.concat([df['customerID'],df[select_features],df['Churn']],axis=1)Id_col=['customerID']target_col=['Churn']#分類型cat_cols=df_model.nunique()[df_model.nunique()<10].index.tolist()#二分類屬性binary_cols=df_model.nunique()[df_model.nunique()==2].index.tolist()#多分類屬性multi_cols=[iforiincat_colsifinotinbinary_cols]#數值型num_cols=[iforiindf_model.columnsifinotincat_cols+Id_col]#二分類-標籤編碼le=LabelEncoder()foriinbinary_cols:df_model[i]=le.fit_transform(df_model[i])#多分類-啞變量轉換df_model=pd.get_dummies(data=df_model,columns=multi_cols)df_model.head()
模型建立和評估
首先使用分層抽樣的方式將數據劃分訓練集和測試集。
#重新劃分X=df_model.drop(['customerID','Churn'],axis=1)y=df_model['Churn']#分層抽樣X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0,stratify=y)print(X_train.shape,X_test.shape,y_train.shape,y_test.shape)#修正索引foriin[X_train,X_test,y_train,y_test]:i.index=range(i.shape[0])(5625,31)(1407,31)(5625,)(1407,)#保存標準化訓練和測試數據st=StandardScaler()num_scaled_train=pd.DataFrame(st.fit_transform(X_train[num_cols]),columns=num_cols)num_scaled_test=pd.DataFrame(st.transform(X_test[num_cols]),columns=num_cols)X_train_sclaed=pd.concat([X_train.drop(num_cols,axis=1),num_scaled_train],axis=1)X_test_sclaed=pd.concat([X_test.drop(num_cols,axis=1),num_scaled_test],axis=1)然後建立一系列基準模型並比較效果。

假如我們關注roc指標,從模型表現效果來看,Naive Bayes效果最好。
我們也可以對模型進行進一步優化,比如對決策樹參數進行調優。
parameters={'splitter':('best','random'),'criterion':("gini","entropy"),"max_depth":[*range(3,20)],}clf=DecisionTreeClassifier(random_state=25)GS=GridSearchCV(clf,parameters,scoring='f1',cv=10)GS.fit(X_train,y_train)print(GS.best_params_)print(GS.best_score_){'criterion':'entropy','max_depth':5,'splitter':'best'}0.585900839405024clf=GS.best_estimator_test_pred=clf.predict(X_test)print('測試集:\n', classification_report(y_test, test_pred))測試集:precisionrecallf1-scoresupport00.860.860.86103310.610.610.61374accuracy0.791407macroavg0.730.730.731407weightedavg0.790.790.791407將這顆樹繪製出來。
importgraphvizdot_data=tree.export_graphviz(decision_tree=clf,max_depth=3,out_file=None,feature_names=X_train.columns,class_names=['not_churn','churn'],filled=True,rounded=True)graph=graphviz.Source(dot_data)
輸出決策樹屬性重要性排序:
imp=pd.DataFrame(zip(X_train.columns,clf.feature_importances_))imp.columns=['feature','importances']imp=imp.sort_values('importances',ascending=False)imp=imp[imp['importances']!=0]table=ff.create_table(np.round(imp,4))py.offline.iplot(table)
後續優化方向:
數據:分類技術應用在目標類別分布越均勻的數據集時,其所建立之分類器通常會有比較好的分類效能。針對數據在目標字段上分布不平衡,可採用過採樣和欠採樣來處理類別不平衡問題;結語
以上就是數據分析在電信行業的具體應用案例了。
對數據分析感興趣的小夥伴,福利來了,今天特地為大家準備了一份數據分析學習資料,歡迎掃碼領取!
掃碼領取學習資料
掌握數據分析技能