
隨著大數(shù)據(jù)的時代的來臨,各個行業(yè)都受到了數(shù)據(jù)分析不同程度的影響和作用。尤其是在電信行業(yè),數(shù)據(jù)分析已經(jīng)逐漸成為電信運營商的戰(zhàn)略優(yōu)勢之一。
大家好,我是一名CDA持證人,今天想跟大家分享一下,我如何從文科生轉(zhuǎn)行成為了一名電信行業(yè)的數(shù)據(jù)挖掘工程師。
主要內(nèi)容分成以下三塊:
首先看到第一部分的內(nèi)容,也就是我的轉(zhuǎn)行歷程。
我高中那會兒讀的是文科,大學期間學習了社會學專業(yè)。在本科期間,我也接觸過一些統(tǒng)計學的知識,線性代數(shù)等知識也學過,但當時對這些學科將來的用途并不是很清楚。
參加工作后,最初我從事產(chǎn)品運營的相關工作。在工作過程中,我接觸到了數(shù)據(jù)分析相關的內(nèi)容。當時我感覺自己工作內(nèi)容比較雜,也沒有拿得出來的技能。
我認為數(shù)據(jù)分析很有前景,無論是文科生還是理科生都可以學,學起來也比較有趣,內(nèi)容不枯燥,所以我漸漸開始學習數(shù)據(jù)分析。
這里我列了幾個對我比較關鍵的節(jié)點,這些對我未來的工作有了較大的影響。
首先就是學數(shù)據(jù)挖掘,用的是SPSS Modeler。比較容易上手,入門也比較簡單。SPSS Modeler雖然很好用,但其實很多時候不能滿足數(shù)據(jù)清洗的一些需求,也有一些劣勢,比如算法更新很慢,只有比較常規(guī)的算法,如果想用比較先進的算法,還是開源的軟件提供的比較多。
之后我學習了Python,比較容易上手,語法也比較簡潔。通過大量練習掌握了爬蟲、數(shù)據(jù)清洗、數(shù)據(jù)可視化等技能點。Python基本能滿足日常工作的需求。
第三個節(jié)點是我學習了SQL和統(tǒng)計知識。SQL本身基礎的知識不是特別復雜,然后主要靠練習,包括統(tǒng)計的一些知識,這也是我在之后的工作中不斷學習的。
目前我目前從事的是數(shù)據(jù)挖掘的相關工作,接下來講一下工作中所需要的一些技能。
這部分可以分為硬技能和軟技能。
硬技能
硬技能這里我分為理論基礎、算法能力、分析工具和通用工具。下面具體來看一看。理論基礎中統(tǒng)計知識是不可或缺的。后面的概率論、線性代數(shù)、微積分其實是跟偏算法相關。
算法方面主要需要一些機器學習跟深度學習的算法。比如分類、回歸、聚類等一些比較基礎的算法。
不同于算法工程師對算法的要求會比較高,像偏業(yè)務的數(shù)據(jù)挖掘的崗位,對算法的要求沒那么高。你能夠做到理解算法的基本原理跟應用場景,能夠應用工具去實現(xiàn)它,能夠解讀算法最后的結(jié)果,也就差不多了,對數(shù)學的要求也并不太高。
關于深度學習,現(xiàn)在數(shù)據(jù)挖掘等算法崗也相對內(nèi)卷,如果你不會也不了解深度學習就有點說不過去了,這方面可以了解一下。還需要掌握一些工具庫,現(xiàn)在深度學習的工具庫比較多,也有一些比較簡便的工具庫能協(xié)助實現(xiàn)相關的功能。
然后看到分析工具。其實目前主要用的也就是SQL跟Python,主要是看你公司的數(shù)據(jù)量,如果數(shù)據(jù)量不是很大的話,基礎的一些SQL知識就夠了,可能關系數(shù)據(jù)庫就可以了,包括在單機里面,去運行Python也可以的;但是如果公司的數(shù)據(jù)量特別大的話,比如我目前是在Hadoop的平臺做一些數(shù)據(jù)分析跟數(shù)據(jù)挖掘。如果本身的數(shù)據(jù)量就比較大,可能會用到Hive數(shù)據(jù)倉庫等。
再看到建模工具,目前其實主流是Python,還有集成了Pyspark,這是用得比較多的。然后建模的話,考慮到數(shù)據(jù)量Python在80%的情況上都是夠用的。
關于通用工具,Excel跟PPT都是比較基礎的。下面這個Shell是開發(fā)工具,很多時候會涉及到一些開發(fā)的工作,比如說標簽表的開發(fā),然后就會用到Shell結(jié)合ETL自動化平臺,調(diào)用需要的腳本進行自動化的運行。就相當于是每天它會自動的跑一些腳本,而不需要去手工或者是在單機操作,這些都是在平臺上面自動完成的。
軟技能
軟技能這塊簡單看一下,包括像業(yè)務的理解,比如你進入任何一個行業(yè),你前幾個月會多花時間了解該行業(yè)的業(yè)務表,業(yè)務涉及的一些內(nèi)容,核心的盈利業(yè)務是哪些。還有一些通用的能力,比如溝通、匯報能力等,因為你經(jīng)常會需要將模型和分析報告講給別人聽,因此這些能力也是十分重要的。還有學習能力。數(shù)據(jù)行業(yè)的迭代比較快,需要有持續(xù)學習的能力。
用Python創(chuàng)建電信客戶流失模型
下面我們再來看一下數(shù)據(jù)分析在電信行業(yè)的應用,目前國內(nèi)運營商運用大數(shù)據(jù)主要有五方面:
(1)網(wǎng)絡管理和優(yōu)化,包括基礎設施建設優(yōu)化和網(wǎng)絡運營管理和優(yōu)化;
(2)市場與精準營銷,包括客戶畫像、關系鏈研究、精準營銷、實時營銷和個性化推薦;
(3)客戶關系管理,包括客服中心優(yōu)化和客戶生命周期管理;
(4)企業(yè)運營管理,包括業(yè)務運營監(jiān)控和經(jīng)營分析;
(5)數(shù)據(jù)商業(yè)化指數(shù)據(jù)對外商業(yè)化。
接下來,今天給大家演示一下,把數(shù)據(jù)分析應用到電信行業(yè)的具體案例,這里教大家用Python寫一個電信用戶流失預測模型。
流失客戶是指那些曾經(jīng)使用過產(chǎn)品或服務,由于對產(chǎn)品失去興趣等種種原因,不再使用產(chǎn)品或服務的顧客。
電信服務公司、互聯(lián)網(wǎng)服務提供商、保險公司等經(jīng)常使用客戶流失分析和客戶流失率作為他們的關鍵業(yè)務指標之一,因為留住一個老客戶的成本遠遠低于獲得一個新客戶。
預測分析使用客戶流失預測模型,通過評估客戶流失的風險傾向來預測客戶流失。由于這些模型生成了一個流失概率排序名單,對于潛在的高概率流失客戶,他們可以有效地實施客戶保留營銷計劃。
下面我們就教你如何用Python寫一個電信用戶流失預測模型,以下是具體步驟和關鍵代碼。
此次分析數(shù)據(jù)來自于IBM Sample Data Sets,統(tǒng)計自某電信公司一段時間內(nèi)的消費數(shù)據(jù)。共有7043筆客戶資料,每筆客戶資料包含21個字段,其中1個客戶ID字段,19個輸入字段及1個目標字段-Churn(Yes代表流失,No代表未流失),輸入字段主要包含以下三個維度指標:用戶畫像指標、消費產(chǎn)品指標、消費信息指標。字段的具體說明如下:
首先導入所需包。
# 數(shù)據(jù)處理
import numpy as np
import pandas as pd
# 可視化
import matplotlib.pyplot as plt
import seaborn as sns
import plotly as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
# 前處理
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
# 建模
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neural_network import MLPClassifier
from sklearn.svm import SVC
from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
# 模型評估
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
from sklearn.metrics import roc_auc_score, roc_curve, scorer
from sklearn.metrics import recall_score, precision_score, f1_score, cohen_kappa_score
pd.set_option('display.max_columns', None)
讀入數(shù)據(jù)集
df = pd.read_csv('./Telco-Customer-Churn.csv')
df.head()
首先進行初步的數(shù)據(jù)清洗工作,包含錯誤值和異常值處理,并劃分類別型和數(shù)值型字段類型,其中清洗部分包含:
# 錯誤值處理
repl_columns = ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection',
'TechSupport','StreamingTV', 'StreamingMovies']
for i in repl_columns:
df[i] = df[i].replace({'No internet service' : 'No'})
# 替換值SeniorCitizen
df["SeniorCitizen"] = df["SeniorCitizen"].replace({1: "Yes", 0: "No"})
# 替換值TotalCharges
df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan)
# TotalCharges空值:數(shù)據(jù)量小,直接刪除
df = df.dropna(subset=['TotalCharges'])
df.reset_index(drop=True, inplace=True) # 重置索引
# 轉(zhuǎn)換數(shù)據(jù)類型
df['TotalCharges'] = df['TotalCharges'].astype('float')
# 轉(zhuǎn)換tenure
def transform_tenure(x):
if x <= 12:
return 'Tenure_1'
elif x <= 24:
return 'Tenure_2'
elif x <= 36:
return 'Tenure_3'
elif x <= 48:
return 'Tenure_4'
elif x <= 60:
return 'Tenure_5'
else:
return 'Tenure_over_5'
df['tenure_group'] = df.tenure.apply(transform_tenure)
# 數(shù)值型和類別型字段
Id_col = ['customerID']
target_col = ['Churn']
cat_cols = df.nunique()[df.nunique() < 10].index.tolist()
num_cols = [i for i in df.columns if i not in cat_cols + Id_col]
print('類別型字段:n', cat_cols)
print('-' * 30)
print('數(shù)值型字段:n', num_cols)
類別型字段:
['gender', 'SeniorCitizen', 'Partner', 'Dependents', 'PhoneService', 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies', 'Contract', 'PaperlessBilling', 'PaymentMethod', 'Churn', 'tenure_group']
------------------------------
數(shù)值型字段:
['tenure', 'MonthlyCharges', 'TotalCharges']
對指標進行歸納梳理,分用戶畫像指標,消費產(chǎn)品指標,消費信息指標。探索影響用戶流失的關鍵因素。
1. 目標變量Churn分布
經(jīng)過初步清洗之后的數(shù)據(jù)集大小為7032條記錄,其中流失客戶為1869條,占比26.6%,未流失客戶占比73.4%。
df['Churn'].value_counts()
No 5163
Yes 1869
Name: Churn, dtype: int64
trace0 = 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. 是否有配偶
從婚姻情況來看,數(shù)據(jù)顯示,未婚人群中流失的比例比已婚人數(shù)高出13%。
plot_bar(input_col='Partner', target_col='Churn', title_name='是否有配偶與是否流失的關系')
5. 上網(wǎng)時長
經(jīng)過分析,這方面可以得出兩個結(jié)論:
plot_bar(input_col='tenure_group', target_col='Churn', title_name='在網(wǎng)時長與是否流失的關系')
6. 付款方式
支付方式上,支付上,選擇電子支票支付方式的用戶流失最高,達到45.29%,其他三種支付方式的流失率相差不大。
pd.crosstab(df['PaymentMethod'], df['Churn'])
plot_bar(input_col='PaymentMethod', target_col='Churn', title_name='付款方式與是否流失關系')
7. 月費用
整體來看,隨著月費用的增加,流失用戶的比例呈現(xiàn)高高低低的變化,月消費80-100元的用戶相對較高。
plot_histogram(input_col='MonthlyCharges', title_name='月費用與是否流失關系')
8. 數(shù)值型屬性相關性
從相關性矩陣圖可以看出,用戶的往來期間和總費用呈現(xiàn)高度相關,往來期間越長,則總費用越高。月消費和總消費呈現(xiàn)顯著相關。
plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), linewidths=0.1, cmap='tab20c_r', annot=True)
plt.title('數(shù)值型屬性的相關性', fontdict={'fontsize': 'xx-large', 'fontweight':'heavy'})
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.show()
使用統(tǒng)計檢定方式進行特征篩選。
# 刪除tenure
df = df.drop('tenure', axis=1)
from feature_selection import Feature_select
# 劃分X和y
X = 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)
2020 09:30:02 INFO attr select success!
After select attr: ['DeviceProtection', 'MultipleLines', 'OnlineSecurity', 'TechSupport', 'tenure_group', 'PaperlessBilling', 'InternetService', 'PaymentMethod', 'SeniorCitizen', 'MonthlyCharges', 'Dependents', 'Partner', 'Contract', 'StreamingTV', 'TotalCharges', 'StreamingMovies', 'OnlineBackup']
經(jīng)過特征篩選,gender和PhoneService字段被去掉。
在python中,為滿足建模需要,一般需要對數(shù)據(jù)做以下處理:
# 篩選變量
select_features = x_sel.columns
# 建模數(shù)據(jù)
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 = [i for i in cat_cols if i not in binary_cols]
# 數(shù)值型
num_cols = [i for i in df_model.columns if i not in cat_cols + Id_col]
# 二分類-標簽編碼
le = LabelEncoder()
for i in binary_cols:
df_model[i] = le.fit_transform(df_model[i])
# 多分類-啞變量轉(zhuǎn)換
df_model = pd.get_dummies(data=df_model, columns=multi_cols)
df_model.head()
首先使用分層抽樣的方式將數(shù)據(jù)劃分訓練集和測試集。
# 重新劃分
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)
#修正索引
for i in [X_train, X_test, y_train, y_test]:
i.index = range(i.shape[0])
(5625, 31) (1407, 31) (5625,) (1407,)
# 保存標準化訓練和測試數(shù)據(jù)
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指標,從模型表現(xiàn)效果來看,Naive Bayes效果最好。
我們也可以對模型進行進一步優(yōu)化,比如對決策樹參數(shù)進行調(diào)優(yōu)。
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.585900839405024
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA 數(shù)據(jù)分析師:表結(jié)構數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構數(shù)據(jù)價值的核心操盤手 表格結(jié)構數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價值,最終要在 “實踐” 中體現(xiàn) —— 脫離業(yè)務場景的分 ...
2025-09-10機器學習解決實際問題的核心關鍵:從業(yè)務到落地的全流程解析 在人工智能技術落地的浪潮中,機器學習作為核心工具,已廣泛應用于 ...
2025-09-09