熱線電話:13121318867

登錄
首頁精彩閱讀作為文科生,我是如何轉行數據挖掘工程師的 | 附電信用戶實戰案例
作為文科生,我是如何轉行數據挖掘工程師的 | 附電信用戶實戰案例
2022-02-23
收藏
作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

隨著大數據的時代的來臨,各個行業都受到了數據分析不同程度的影響和作用。尤其是在電信行業,數據分析已經逐漸成為電信運營商的戰略優勢之一。

大家好,我是一名CDA持證人,今天想跟大家分享一下,我如何從文科生轉行成為了一名電信行業的數據挖掘工程師。

主要內容分成以下三塊:

  • 第一部分我作為文科生轉行數據挖掘的歷程;
  • 第二部分關于目前從事數據挖掘,主要針對商業數據挖掘所需要掌握的一些技能;
  • 第三部分案例分享:數據分析思維如何應用到電信行業,電信用戶流失預測模型

01、文科生轉行數據挖掘工程師的歷程

首先看到第一部分的內容,也就是我的轉行歷程。

我高中那會兒讀的是文科,大學期間學習了社會學專業。在本科期間,我也接觸過一些統計學的知識,線性代數等知識也學過,但當時對這些學科將來的用途并不是很清楚。

參加工作后,最初我從事產品運營的相關工作。在工作過程中,我接觸到了數據分析相關的內容。當時我感覺自己工作內容比較雜,也沒有拿得出來的技能。

我認為數據分析很有前景,無論是文科生還是理科生都可以學,學起來也比較有趣,內容不枯燥,所以我漸漸開始學習數據分析。

這里我列了幾個對我比較關鍵的節點,這些對我未來的工作有了較大的影響。

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

首先就是學數據挖掘,用的是SPSS Modeler。比較容易上手,入門也比較簡單。SPSS Modeler雖然很好用,但其實很多時候不能滿足數據清洗的一些需求,也有一些劣勢,比如算法更新很慢,只有比較常規的算法,如果想用比較先進的算法,還是開源的軟件提供的比較多。

之后我學習了Python,比較容易上手,語法也比較簡潔。通過大量練習掌握了爬蟲、數據清洗、數據可視化等技能點。Python基本能滿足日常工作的需求。

第三個節點是我學習了SQL和統計知識。SQL本身基礎的知識不是特別復雜,然后主要靠練習,包括統計的一些知識,這也是我在之后的工作中不斷學習的。

02、從事數據挖掘技能需求

目前我目前從事的是數據挖掘的相關工作,接下來講一下工作中所需要的一些技能。

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

這部分可以分為硬技能和軟技能。

硬技能

硬技能這里我分為理論基礎、算法能力、分析工具和通用工具。下面具體來看一看。理論基礎中統計知識是不可或缺的。后面的概率論、線性代數、微積分其實是跟偏算法相關。

算法方面主要需要一些機器學習深度學習的算法。比如分類、回歸、聚類等一些比較基礎的算法。

不同于算法工程師對算法的要求會比較高,像偏業務的數據挖掘的崗位,對算法的要求沒那么高。你能夠做到理解算法的基本原理跟應用場景,能夠應用工具去實現它,能夠解讀算法最后的結果,也就差不多了,對數學的要求也并不太高。

關于深度學習,現在數據挖掘等算法崗也相對內卷,如果你不會也不了解深度學習就有點說不過去了,這方面可以了解一下。還需要掌握一些工具庫,現在深度學習的工具庫比較多,也有一些比較簡便的工具庫能協助實現相關的功能。

然后看到分析工具。其實目前主要用的也就是SQL跟Python,主要是看你公司的數據量,如果數據量不是很大的話,基礎的一些SQL知識就夠了,可能關系數據庫就可以了,包括在單機里面,去運行Python也可以的;但是如果公司的數據量特別大的話,比如我目前是在Hadoop的平臺做一些數據分析跟數據挖掘。如果本身的數據量就比較大,可能會用到Hive數據倉庫等。

再看到建模工具,目前其實主流是Python,還有集成了Pyspark,這是用得比較多的。然后建模的話,考慮到數據量Python在80%的情況上都是夠用的。

關于通用工具,Excel跟PPT都是比較基礎的。下面這個Shell是開發工具,很多時候會涉及到一些開發的工作,比如說標簽表的開發,然后就會用到Shell結合ETL自動化平臺,調用需要的腳本進行自動化的運行。就相當于是每天它會自動的跑一些腳本,而不需要去手工或者是在單機操作,這些都是在平臺上面自動完成的。

軟技能

軟技能這塊簡單看一下,包括像業務的理解,比如你進入任何一個行業,你前幾個月會多花時間了解該行業的業務表,業務涉及的一些內容,核心的盈利業務是哪些。還有一些通用的能力,比如溝通、匯報能力等,因為你經常會需要將模型和分析報告講給別人聽,因此這些能力也是十分重要的。還有學習能力。數據行業的迭代比較快,需要有持續學習的能力。

03、數據分析項目實操

用Python創建電信客戶流失模型

下面我們再來看一下數據分析在電信行業的應用,目前國內運營商運用大數據主要有五方面:

(1)網絡管理和優化,包括基礎設施建設優化和網絡運營管理和優化;

(2)市場與精準營銷,包括客戶畫像、關系鏈研究、精準營銷、實時營銷和個性化推薦;

(3)客戶關系管理,包括客服中心優化和客戶生命周期管理;

(4)企業運營管理,包括業務運營監控和經營分析;

(5)數據商業化指數據對外商業化。

接下來,今天給大家演示一下,把數據分析應用到電信行業的具體案例,這里教大家用Python寫一個電信用戶流失預測模型。

01、商業理解

流失客戶是指那些曾經使用過產品或服務,由于對產品失去興趣等種種原因,不再使用產品或服務的顧客。

電信服務公司、互聯網服務提供商、保險公司等經常使用客戶流失分析和客戶流失率作為他們的關鍵業務指標之一,因為留住一個老客戶的成本遠遠低于獲得一個新客戶。

預測分析使用客戶流失預測模型,通過評估客戶流失的風險傾向來預測客戶流失。由于這些模型生成了一個流失概率排序名單,對于潛在的高概率流失客戶,他們可以有效地實施客戶保留營銷計劃。

下面我們就教你如何用Python寫一個電信用戶流失預測模型,以下是具體步驟和關鍵代碼。

02、數據理解

此次分析數據來自于IBM Sample Data Sets,統計自某電信公司一段時間內的消費數據。共有7043筆客戶資料,每筆客戶資料包含21個字段,其中1個客戶ID字段,19個輸入字段及1個目標字段-Churn(Yes代表流失,No代表未流失),輸入字段主要包含以下三個維度指標:用戶畫像指標、消費產品指標、消費信息指標。字段的具體說明如下:

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

03、數據讀入和概覽

首先導入所需包。

# 數據處理
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)


讀入數據集

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

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

04、數據初步清洗

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

  • OnlineSecurity、OnlineBackup、DeviceProtection、TechSupport、StreamingTV、StreamingMovies:錯誤值處理
  • TotalCharges:異常值處理
  • tenure:自定義分箱
  • 定義類別型和數值型字段

# 錯誤值處理
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空值:數據量小,直接刪除
df = df.dropna(subset=['TotalCharges'])
df.reset_index(drop=True, inplace=True
# 重置索引
# 轉換數據類型
df['TotalCharges'] = df['TotalCharges'].astype('float')
# 轉換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)
# 數值型和類別型字段
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('數值型字段: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']

05、探索性分析

對指標進行歸納梳理,分用戶畫像指標,消費產品指標,消費信息指標。探索影響用戶流失的關鍵因素。

1. 目標變量Churn分布

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

經過初步清洗之后的數據集大小為7032條記錄,其中流失客戶為1869條,占比26.6%,未流失客戶占比73.4%。

df['Churn'].value_counts()
No 5163
Yes 1869
NameChurndtypeint64


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.性別

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

分析可見,男性和女性在客戶流失比例上沒有顯著差異。

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

3. 老年用戶

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

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

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

4. 是否有配偶

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

從婚姻情況來看,數據顯示,未婚人群中流失的比例比已婚人數高出13%。

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

5. 上網時長

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

經過分析,這方面可以得出兩個結論:

  • 用戶的在網時長越長,表示用戶的忠誠度越高,其流失的概率越低;
  • 新用戶在1年內的流失率顯著高于整體流失率,為47.68%。


plot_bar(input_col='tenure_group', target_col='Churn', title_name='在網時長與是否流失的關系')

6. 付款方式

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

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

pd.crosstab(df['PaymentMethod']df['Churn'])

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

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

7. 月費用

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

整體來看,隨著月費用的增加,流失用戶的比例呈現高高低低的變化,月消費80-100元的用戶相對較高。

plot_histogram(input_col='MonthlyCharges', title_name='月費用與是否流失關系')

8. 數值型屬性相關性

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

從相關性矩陣圖可以看出,用戶的往來期間和總費用呈現高度相關,往來期間越長,則總費用越高。月消費和總消費呈現顯著相關。

plt.figure(figsize=(1510))
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()

06、特征選擇

使用統計檢定方式進行特征篩選。

# 刪除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']

經過特征篩選,gender和PhoneService字段被去掉。

07、建模前處理

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 = [i for i in cat_cols if i not in binary_cols]
# 數值型
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])
# 多分類-啞變量轉換
df_model = pd.get_dummies(data=df_model, columns=multi_cols)
df_model.head()

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

08、模型建立和評估

首先使用分層抽樣的方式將數據劃分訓練集和測試集。

# 重新劃分
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,)


# 保存標準化訓練和測試數據
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)

然后建立一系列基準模型并比較效果。

作為文科生,我是如何轉行<a href='/map/shujuwajue/' style='color:#000;font-size:inherit;'>數據挖掘</a>工程師的 | 附電信用戶實戰案例

假如我們關注roc指標,從模型表現效果來看,Naive Bayes效果最好。

我們也可以對模型進行進一步優化,比如對決策樹參數進行調優。

parameters = {'splitter': ('best','random'),
'criterion': ("gini","entropy"),
"max_depth": [*range(320)],
}
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

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢