國際著名的諮詢公司Gartner在2013年總結出了一套數據分析的框架,數據分析的四個層次:描述性分析、診斷性分析、預測性分析、處方性分析。
Gartner於2020年中給出預測,到2024年底,75%的企業機構將從AI試點轉爲AI運營。同期,Gartner發佈了數據與分析領域的十大技術趨勢,首先映入眼簾的是:更智能、更高速、更負責的AI,也指出了儀表板的衰落,更青睞上層次和實用化的決策智能。
1. 前言
我們在設計數據分析產品和數據可視化的時候,依據是什麼?怎樣設計數據分析產品才能給用戶更多的業務支撐?我們做趨勢預測、精準識別目的是什麼?
最近,我有些感悟分享與讀者探討、研究。
對於設計數據分析產品和數據可視化,我們首先想到的是需求,然後是業務機理。但是,在大數據、新一代人工智能高速發展的今天,對比Gartner給出數據分析諮詢意見,我們不應拘泥於當前的業務場景,業務創新也可以通過新技術引領。
我們回到數據分析產品和數據可視化設計,除了需求和業務機理以外,我們不妨以金字塔思維模型來構建這樣的場景。
一、目的
我們的目的是實現經濟發展和利潤,解決未來或當下的問題。比如新零售業務核心是圍繞客戶展開,解決客戶發展和流速問題,是企業發展和利潤的基石。
二、分析需求和識別待解決問題
分析需求是深入業務機理,重塑業務模型,以發展的眼光識別問題,解決問題。仍以新零售客戶發展爲例,客戶流失是難以解決的問題,要解決客戶流失問題,需要我們重塑客戶全生命週期管理模型,識別問題機理和影響因素。
三、以預設或假設結論先行
我們以需求和待解決問題爲基準,經過理論聯繫實際,設定解決問題目標。如果仍以客戶流失問題爲基準,並按公司現狀和發展,我們設定客戶流失率控制目標是20%,挽回率爲70%,預測準確度爲80%等。
爲此,我們先借鑑國際Kaggle大賽電信客戶流失題目爲例,其數據爲“WA_Fn-UseC_-Telco-Customer-Churn”,參照推演結論。
四、以上統下,逐層展開
我們有了結論目標,接着就是落地證明結論,分層分類展開。比如仍以客戶流失問題爲例,先通觀全局,我們已經能做到預測客戶流失,預測客戶流失爲26.54%,預測模型準確率達到80%。我們據此分類展開模型的影響因素分析,這也是數據分析、數據可視化內容。例如根據模型重要影響因素和相關性,給出個人特徵、行爲特徵、服務特徵三大類。
分層子觀點如下:
1、以動態規劃優化策略,通過優惠券方式降低流失客戶的客戶單價,實現減少流失客戶;
2、以客戶生命週期的時間序列預測客戶流失預警;
3、流失客戶的月消費金額(客單價)、在網時長等因素對客戶流失影響較大。
五、給出解決措施,逐層分解,體現數據分析更智能。
2. 電信客戶流失案例
2.1. 背景
電信行業關於用戶留存有這樣一個觀點[2],如果將用戶流失率降低5%,公司利潤將提升25%-85%。如今,高居不下的獲客成本讓電信運營商遭遇“天花板”,甚至陷入獲客難的窘境。隨着市場飽和度上升,電信運營商亟待解決增加用戶黏性,延長用戶生命週期的問題。因此,電信用戶流失分析與預測至關重要。因此做好“用戶流失預測分析”可以:
1、降低營銷成本。業界通用經驗,“新客戶開發成本”是“老客戶維護成本”的5倍。
2、獲得更好的用戶體驗。並不是所有的增值服務都可以有效留住客戶。
3、獲得更高的銷售回報。可以識別價格敏感型客戶和非價格敏感性客戶。
2.2. 客戶數據集及其流失預測分析
2.2.1. 數據集
字段名稱 | 說明 | 數據解釋 |
---|---|---|
customerID | 用戶ID | |
gender | 性別 | Female & Male |
SeniorCitizen | 老年人 | 1表示是,0表示不是 |
Partner | 是否有配偶 | Yes or No |
Dependents | 是否經濟獨立 | Yes or No |
tenure | 客戶已使用月份數 | 0-72月,0爲新開戶 |
PhoneService | 是否開通電話服務業務 | Yes or No |
MultipleLines | 是否開通了多線業務 | Yes 、No or No phoneservice |
InternetService | 是否開通互聯網服務 | No, DSL數字網絡,fiber optic光纖網絡 |
OnlineSecurity | 是否開通網絡安全服務 | Yes,No,No internetserive |
OnlineBackup | 是否開通在線備份業務 | Yes,No,No internetserive |
DeviceProtection | 是否開通了設備保護業務 | Yes,No,No internetserive |
TechSupport | 是否開通了技術支持服務 | Yes,No,No internetserive |
StreamingTV | 是否開通網絡電視 | Yes,No,No internetserive |
StreamingMovies | 是否開通網絡電影 | Yes,No,No internetserive |
Contract | 簽訂合同方式 | 按月,一年,兩年 |
PaperlessBilling | 是否開通電子賬單 | Yes or No |
PaymentMethod | 付款方式 | bank transfer,credit card,electronic check,mailed check |
MonthlyCharges | 月費用 | |
TotalCharges | 總費用 | |
Churn | 該用戶是否流失 | Yes or No |
2.2.2. 數據預處理與特徵提取
1、數據缺失處理
經過觀察,發現這11個用戶‘tenure’(入網時長)爲0個月,推測是當月新入網用戶。根據一般經驗,用戶即使在註冊的當月流失,也需繳納當月費用。因此將這11個用戶入網時長改爲1,將總消費額填充爲月消費額,符合實際情況。
#'TotalCharges'存在缺失值,強制轉換爲數字,不可轉換的變爲NaN
self.CData['TotalCharges']=pd.to_numeric(self.CData['TotalCharges'], errors='coerce') #astype('float64')
#將總消費額填充爲月消費額
self.CData['TotalCharges'] = self.CData[['TotalCharges']].apply(lambda x: x.fillna(self.CData['MonthlyCharges']),axis=0)
#查看是否替換成功
print(self.CData[self.CData['tenure']==0][['tenure','MonthlyCharges','TotalCharges']])
2、特徵編碼與特徵增維
觀察數據類型,除了“tenure”、“MonthlyCharges”、“TotalCharges”是連續特徵外,其它都是離散特徵。
- 對於連續特徵,採用標準化方式處理;
- 對於離散特徵,特徵之間沒有大小關係,採用one-hot編碼;
- 對於離散特徵,特徵之間有大小關聯,則採用數值映射,例如這的Yes與No,隱含有和無,既0與1的關係。
Pandas技術方案:
- pd.get_dummies()就是把離散字符或者其他類型編碼變成一串數字向量(縱向轉爲橫向的數據列),也就是所謂的one-hot編碼,數據增維。
- pd.factorize()就是把離散字符或者其他類型編碼變成一列連續數字,通常轉變爲0、1,或者,連續有一定意義的。
Cols = [c for c in self.CData.columns if self.CData[c].dtype == 'object' or c == 'SeniorCitizen']
Cols.remove('Churn')
# 對於離散特徵,特徵之間沒有大小關係,採用one-hot編碼;特徵之間有大小關聯,則採用數值映射。
for col in Cols:
if self.CData[col].nunique() == 2:
self.CData[col] = pd.factorize(self.CData[col])[0]
else:
self.CData = pd.get_dummies(self.CData, columns=[col])
self.CData['Churn']=self.CData['Churn'].map({
'Yes':1,'No':0})
2.2.3. 影響流失特徵重要程度排序
數據集原始特徵爲21個,在特徵離散化及升維達到40個特徵,通過隨機森林算法擬合客戶流失,找出特徵排序,實現代碼參考引用[3]詳細說明。
對排序結果數值進行分析,獲得重要前六項特徵,以及考慮可以捨棄的特徵,例如:PhoneService、StreamingTV等。
2.2.4. 與客戶流失相關特徵分析
數據集原始特徵爲21個,在特徵離散化及升維達到40個特徵,通過皮爾森相關係數方法,找出能幫助理解特徵和響應變量之間關係的方法,該方法衡量的是變量之間的線性相關性(詳細參加[3]說明)。
我們觀察關係係數接近於0的特徵,有的和前面特徵重要程度存在一定的穩合,例如PhoneService、StreamingTV,與流失關係係數接近0。
2.2.5. 數據不平衡處理
由於預測識別客戶流失屬於二分類的問題,而且流失佔比較少,形成分類樣本不平衡問題,針對數據不平衡問題,採用欠採樣的方式進行處理,使用機器學習庫中的SMOTE。
pip install imblearn
#from imblearn.over_sampling import SMOTE
self.x_train,self.x_test, self.y_train, self.y_test = train_test_split(X,Y,test_size=0.3)
#利用SMOTE創造新的數據集 ,#初始化SMOTE 模型
oversampler=SMOTE(random_state=0)
#使用SMOTE模型,創造新的數據集
os_features,os_labels=oversampler.fit_sample(self.x_train,self.y_train)
#切分新生成的數據集
os_features_train, os_features_test, os_labels_train, os_labels_test = train_test_split(os_features, os_labels, test_size=0.2)
self.x_train,self.x_test, self.y_train, self.y_test = os_features_train, os_features_test, os_labels_train, os_labels_test
'''
#看看新構造的oversample數據集中0,1分佈情況
#常用pandas的value_counts確認數據出現的頻率
os_count_classes = pd.value_counts(os_labels['Churn'], sort = True).sort_index()
os_count_classes.plot(kind = 'bar')
plt.title("Fraud class histogram")
plt.xlabel("Class")
plt.ylabel("Frequency")
plt.show()
'''
經過SMOTE欠採樣處理後,樣本數據集均衡。
基於均衡處理後的數據集進行預測,預測結果準確率由80%提升到87%(未做優化參數)。
如果,使用原分離出來的30%樣本的做爲測試集,則模型預測準確率沒有得到明顯提升,爲什麼?
2.2.6. 結論
根據以上分析,我們可以大致得到高流失率用戶的特徵:
- 用戶屬性:老年,未婚、沒有依賴關係;
- 服務屬性:開通光纖服務/光纖附加流媒體電視、電影服務;
- 行爲屬性:在網時長小於一年,簽訂的合同期限較短,採用電子支票支付,使用電子賬單,月消費金額約在70-110元之間;
- 其它屬性對用戶流失影響較小。
2.3. 經驗總結
2.3.1. 特徵分類層次化
總結預測客戶流失研究過程,我們將所有輸入原始特徵分成了三個類別:客戶個人屬性、客戶行爲屬性,客戶服務屬性,如下圖所示,分別對他們進行分析。
2.3.2. 特徵離散化
離散化後的特徵對異常數據有更強的魯棒性,降低過擬合的風險,模型會更穩定,預測的效果也會更好。
例如“在網時長”特徵,實際上的使用更多是表述時長的等級,我們參看如下數據分佈直方圖,可以幾個級別,對比我們實際業務就是剛剛入網的客戶,多年的老客戶等等。
2.3.3. 離散特徵 one-hot編碼
我們經常遇到數據特徵,是對某些特徵進行歸類管理,例如下圖的“付款方式”,每種付款方式都是獨立的,以是、否方式表示,而且有可能存在多種付款方式。對於這樣的特徵我們應該採用one-hot方式編碼,相當於給數據集升維。
我們也經常遇到數據特徵,是對數值數據使用的描述,而實際上是有數值大小意義的,例如圖中“合同期限”,按月描述就是:按月對應1(個月)、按一年對應12(個月)、按兩年對應24(個月),這樣更適合表述特徵含義。
2.3.4. 特徵與指標
我們通過過程中的輸出結果,逐步確立分析指標,設定參考標準。例如用戶在網時長,根據前面的數據分佈圖,以及離散化策略,我們可以離散化出多個在網時長的區間,而且通常這樣的分析方法效果更好,也方便對標。
對於one-hot類編碼,往往是業務分類產生的,這也是產生指標的一個重要來源,而且可以根據重要程度而確立指標。
3. 根據預測結論設計數據分析產品
著名的諮詢公司Gartner在2013年總結、提煉出了一套數據分析的框架,數據分析的四個層次:描述性分析、診斷性分析、預測性分析、處方性分析。
我們雖然憑經驗直接給出處方分析是很難實現的,但是我們可以先從預測結論倒敘推理,自頂向下,根據預測結論及預測分析過程輸出核心結果,形成以重要影響因素、經營管理考覈指標(需求)、特徵相關性爲主的層次子結論,逐層分類展開數據分析產品設計。
數據分析研發過程原則:
- 數據驅動、AI驅動,產品設計利用數據和AI技術
- 產品設計界定研發邊界
- 研發邊界和深度依賴資源並受資源限制
- 提供模型可解釋性
- 研發過程遵循迭代循環
接下來,我們仍以客戶流失爲例,按上圖,根據“探索性分析”的結果和結論,展開“產品設計”過程。下圖是客戶全生命週期,其中客戶流失的拐點,流失預警期將是我們的重中之重。
3.1. 預測結論及分析(頂層)
我們所設計預測,是想提前知道未發生的事和預期結果對比。預測結果仍以數據描述方式表達,如果繼續以客戶流失預測爲例,需要表達的內容如下:
1、客戶流失率、流失數量、流失客戶明細,預測流失與同期、上期、管理指標對標分析,包括同期比、環比。
客戶流失造成月收入減少30.5%。
plt.rcParams['figure.figsize']= 12,6 #6,6
plt.subplot(1,2,1)
plt.pie(self.df['Churn'].value_counts(),labels=self.df['Churn'].value_counts().index,autopct='%1.2f%%',explode=(0.1,0))
plt.title('Churn(Yes/No) Ratio')
plt.subplot(1,2,2)
dd = self.df[['MonthlyCharges','TotalCharges','Churn']].groupby(['Churn'], as_index=False).sum()
plt.pie(dd['MonthlyCharges'],labels=dd['Churn'],autopct='%1.2f%%',explode=(0.1,0))
plt.title('Churn(Yes/No) MonthlyCharges')
plt.show()
2、流失客戶帶來的影響,流失客戶所引起減少的(月)收入,需要打新多少新用戶彌補及實現概率。
3、影響客戶流失重要因素、相關因素,並給出優化措施建議。
我們依據客戶流失集各個特徵的重要程度,重點分析消費金額和在網時長。其實這些和我們實際經驗比較接近,大多數客戶最關心的就是錢,對價格比較敏感。
所以,我們的產品設計上,將傾向分析客戶價格敏感情況,建立客戶價格敏感畫像,以及相關支撐服務。
3.2. 分析重要影響因素
我們依舊預測過程中重要因素、相關因素等輸出,深入分析這些因素(爲了簡便說明,此處只是使用了XGBoost算法預測),例如:
如上圖所示,位列三甲重要特徵爲月度消費金額、總消費金額、在網時長,與我們經驗認知一致,流失很大原因就是差錢!
1、分類對比流失客戶與未流失客戶的月消費金額(客單價),分類對比流失客戶與未流失客戶的在網時長。
def kdeAnalysis(self):
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(18, 5))
plt.subplot(1,3,1)
kdeplot('MonthlyCharges','月度消費',self.df,'Churn')
plt.subplot(1,3,2)
kdeplot('TotalCharges','總消費額',self.df,'Churn')
plt.subplot(1,3,3)
kdeplot('tenure','在網時長',self.df,'Churn')
plt.show()
# Kernel density estimaton核密度估計
def kdeplot(feature,xlabel,data,tag='Churn'):
plt.title("KDE for {0}".format(feature))
plt.yticks(fontsize=8)
plt.xticks(fontsize=8)
sns.set(font='SimHei') #, font_scale=0.8) # 解決Seaborn中文顯示問題
sns.set_style({
'font.sans-serif':['simhei', 'Arial']})
ax0 = sns.kdeplot(data[data['Churn'] == 'No'][feature], label= '未流失', shade='True',legend=True)
ax1 = sns.kdeplot(data[data['Churn'] == 'Yes'][feature], label= '流失',shade='True',legend=True)
plt.xlabel(xlabel)
plt.rcParams.update({
'font.size': 10})
plt.legend(fontsize=10)
2、分析月消費金額、在網時長等重要特徵的相關因素
在給定電信客戶流失數據集中,各個特徵獨立性較強,如下圖所示,沒有必要深入分析其他特徵的相關性。
3、選擇影響重要因素分析
如下圖所示,只分析重要影響因素,而對於類似“PhoneService”特徵,影響靠後的可以略去,不予以分析。
def serviceAnalysis(self):
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
sns.set(font='SimHei') #, font_scale=0.8) # 解決Seaborn中文顯示問題
sns.set_style({
'font.sans-serif':['simhei', 'Arial']})
self.df['churn_rate'] = self.df['Churn'].replace("No", 0).replace("Yes", 1)
items=['OnlineSecurity','OnlineBackup','DeviceProtection','TechSupport','InternetService', 'StreamingMovies']
items_name=['安全服務','備份業務','保護業務','技術支持','互聯網服務','網絡電影']
def get_order(items_index):
if items_index == 4:
return ['DSL','Fiber optic','No']
else:
return ['Yes','No','No internet service']
fig,axes=plt.subplots(nrows=2,ncols=3,figsize=(8,12))
for i,item in enumerate(items):
plt.subplot(2,3,(i+1))
ax=sns.barplot(x=item,y='churn_rate',data=self.df,order=get_order(i))
plt.rcParams.update({
'font.size': 12})
plt.xlabel(str(items_name[i]))
plt.title(str(items_name[i])+'流失情況')
i+=1
plt.show()
3.2. 確立分析指標
如何確立分析指標呢?一般情況下,我們從兩個方面考慮:一是業務原理和需求所規定的,屬於剛需,也可能不合理,我們可以試探打破;二是數據驅動、AI驅動所邏輯推理給出的。
3.2.1. 基於業務機理提煉指標
例如客戶指標:
- 客單價:銷售額/客戶數,反映客戶的質量、消費水平。
- 件單價:銷售額/銷售量,反映客戶的購買商品的平均單價;
- 客單件:銷售量/客戶數,反映客戶的購買力,購買多少商品的數量;
- 連帶率:銷售量/成交單量,也叫作購物籃係數,連帶率和人、場有關。
- 新增會員數:新增會員數=期末會員數-期初會員總數
- 會員增長率:會員增長率=某短時間新增會員數/期初有效會員數
- 會員貢獻率:會員貢獻率=會員銷售總額/總銷售額
- 有效會員佔比: 有效會員佔比=有效會員總數/累計會員總數
- 會員流失率:會員流失率=某段時間內流失的會員數/期初有效會員總數
- 會員活躍度: 會員活躍度=活躍會員數量/會員總量
- 平均購買次數:平均購買次數=某個時間段內訂單總數/會員總數
- 會員平均年齡: 會員平均年齡=某個時間段店內會員年齡總和/有效會員總數
3.2.2. 數據驅動、AI驅動邏輯給出
1、數據增維,產生新的特徵,例如新增“月平均消費”,月平均消費=總消費/在網時長,如下圖所示,屬於重要特徵,我們可以建議設置爲分析指標。
2、聚類,例如對流失客羣分類,其實我們也不知道怎麼分,那麼可以先試探聚類算法看結果,初步來看是和平均消費額大小關係更爲密切。
def clusteringAnalysis(self):
data = self.df[self.df['Churn']==1].reset_index(drop=True)#重設索引
samples = data[['MonthlyCharges','TotalCharges','AverageChargs','tenure','Contract']]
#標準化
scaler=StandardScaler()
kmeans=MiniBatchKMeans(n_clusters=3,random_state=9,max_iter=100)
pipeline=make_pipeline(scaler,kmeans)
pipeline.fit(samples) #訓練模型
labels=pipeline.predict(samples)#預測
samples['labels'] = labels #合併數據集
強化學習構建聚類指標,通過獎勵大,最終建立一個Q值表?
3、對現有特徵數據項轉化,例如one-hot編碼所轉換出來的,在預測模型中表現比較重要的離散數據項,也可能升格爲分析指標。
3.3. 可視化
數據可視化,正如本文開始所說的,和數據分析的四個層次密切相關。數據可視化可以分爲描述性分析、診斷性分析、預測性分析、處方性分析。
我們通常我看到的圖表,主要是通俗化數學統計範疇的內容,大多數人都能看懂,其實,我們還需要專業化圖表,爲專業化服務。
4. 總結
通過客戶流失預測案例感悟數據分析設計方法,正如Gartner於2020年給出數據分析領域的技術趨勢,更智能、更高速、更負責的AI,凸顯新技術引領業務,以站在高緯度上的預測結果爲頂層設計,倒逼數據診斷分析、描述性分析,使業務數據分析線條更清晰,目的更明確。
對於數據分析工作崗位,其實可以分爲兩種:一種類似產品經理、一種偏向數據挖掘,類似產品經理向更加註重業務,對業務能力要求比較高;數據挖掘向更加註重技術,對算法代碼能力要求比較高。
由於作者水平有限,歡迎交流討論。
本文涉及代碼詳見:https://github.com/xiaoyw71/Feature-engineering-machine-learning
參考:
[1].《電信用戶流失分析與預測》 知乎 ,南橋那人 ,2019年6月
[2].《Telco Customer Churn》 CSDN博客 , qqissweat ,2021年1月
[3].《大數據人工智能常用特徵工程與數據預處理Python實踐(2)》 CSDN博客 ,肖永威,2020年12月
[4].《oversample 過採樣方法 SMOTE ——欠採樣(undersampling)和過採樣(oversampling)會對模型帶來怎樣的影響》 CSDN博客, Arthur-Ji ,2019年8月
[5].《數據分析的四個層次》 人人都是產品經理 , 大鵬 ,2020年7月
[6].《Gartner發佈2020年數據與分析領域的十大技術趨勢》 Gartner ,Laurence Goasduff ,2020.06
[7].《最全的零售行業指標體系詳解!》 知乎 ,李啓方 ,2020年10月