預測性客戶分析之藉助聚類和預測分析優化售後服務(Part 4)

資料猿發表於2018-03-11
640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

【資料猿導讀】本篇是這個系列文章的最後一個部分,將要說明的重點案例是利用聚類分析對售後問題進行分組,對不同分組進行分析,進而採取針對性的優化或者行動


作者 | TalkingData

官網 | www.datayuan.cn

微信公眾號ID | datayuancn


本篇是這個系列文章的最後一個部分,將要說明的重點案例是利用聚類分析對售後問題進行分組,對不同分組進行分析,進而採取針對性的優化或者行動。


如果你讀過以前的幾篇文章,你知道在故事中,顧客X已經購買了一臺膝上型電腦。現在想象一下,他正嘗試在家裡設定這臺電腦。在設定的時候,他發現該電腦無法與無線鍵盤正常連線。他認為自己搞砸了設定並試圖找到解決辦法:他瀏覽產品網站檢視是否有任何自助視訊可幫助他找出原因,但他並沒找到任何有用的資訊。然後他打電話給公司,得到了一個自動提示讓他提供所有的資訊。


他在接下來的15分鐘排隊等候,最終,他排到了一位客戶代表,客戶代表再次要求他提供所有資訊。正如你可以想象的那樣,X變得更加惱火。客戶代表在聽到他的問題後,通過電話向他提供了一些指示,但X無法理解並按照步驟來操作。他要求提供現場幫助,但客戶代表拒絕了他,說他的保修不包含現場服務。X感覺非常沮喪,開始考慮再也不從這家供應商購買任何東西。


這是因低質量服務和支援而感到沮喪的無數顧客中的一個例子。在今天的網際網路世界中,更換供應商只需點選一下滑鼠即可。企業需要更努力、更聰明地保持現有客戶的滿意度,並且通過他們的推薦獲得新的客戶。客戶服務流程從為客戶提供互動選項開始,從網站自助、電子郵件到電話支援,今天的支援中心執行在全方位的各種渠道上。


一旦客戶發起聯絡,企業就需要為他們提供優質的服務:詢問最少的問題並迅速解決問題。


這就要求企業不僅要了解客戶,還要了解客戶當前問題發生的背景以及與客戶互動的整個過程。企業需要讓客戶感覺到企業真正瞭解並關心他的問題。


今天的客戶服務世界已經開始轉向使用互動式語音和聊天機器人的自助服務和自動化的時代。


這些自動化的服務需要智慧地預測客戶正在經歷的事情,並能理解客戶問題,提供快速的解決方案。預測性分析肯定會對客戶服務領域有所幫助。


預測客戶發起聯絡的目的

640?wx_fmt=png


讓我們思考一下前面做錯了什麼。假定客戶X在銷售階段已經將自己的電話號碼提供給了公司,客戶支援難道不應該通過他的呼叫ID自動識別他嗎?


客戶X在膝上型電腦交付給他兩天之內打電話,是否意味著這通電話非常有可能與這次購買有關呢?在第一次電話過程中,客戶支援針對他的膝上型電腦鍵盤問題建立了一個問題記錄,並且給了他一些建議。


然而,過了兩個小時之後他又打電話過來,客戶支援能否推測到他的第二個電話非常有可能與第一個問題記錄有關係?這個用例的目標是建立一個預測模型,這個預測模型可以預測客戶聯絡企業的可能性原因。知道這個原因可以幫助企業快速將客戶對接到能解決相應問題的人那裡,從而讓問題在第一次互動時得到解決。這個用例中的資料是過去的所有客戶和企業之間的交易資料。


這些資料包含銷售的交易資訊,包括產品、狀態以及交付的詳細資料。我們將來也會使用客戶與企業以往聯絡的資料。對於每一次聯絡,我們會使用原因、處理這次聯絡的客戶代表、時長、根本原因、解決方案、狀態等資料。這是一個分類問題,因此前面我們使用過的演算法就比較適合。讓目標分類的數量小於10是非常重要的。


將要使用的演算法會被用來產生預測目的模型,我們將會使用銷售交易和與以前的聯絡相關的資料去產生這個模型,並將用模型預測客戶聯絡的目的。行動計劃如下:這個分類模型會離線進行構建,當一個客戶通過電話或者聊天工具聯絡企業時,使用呼叫者ID或者使用者ID去識別客戶,然後使用演算法去預測這次呼叫的原因。如果預測呼叫的原因是上一次的購買,則通過IVR回答客戶“您好,請問您是因最近購買的膝上型電腦有問題而需要幫助嗎”。客戶一定會感到非常高興,因為企業能夠猜測他的問題,儘管這不一定是真正的原因。


640?wx_fmt=jpeg


這恰當地表明瞭我們理解他並且知道他正在經歷什麼困難。


 尋找不滿意的客戶

640?wx_fmt=png


一個企業該如何發現他的客戶對於企業的產品或者服務是滿意還是不滿意呢?


第一, 不滿意的客戶通常會對調查問卷進行反饋。仔細想一下,因為X先生對服務以及產品感到不滿意,他通常更願意花時間去填寫調查問卷和發洩。但是Y女士則未必會如此。


第二, 通常僅僅有10%的客戶會對調查進行反饋。那麼企業如何能夠識別出那些沉默的、想要或者已經轉移到其他企業的客戶呢?這個用例的目標是構建一個模型,這個模型能夠預測企業的所有使用者的滿意度,不管這個使用者是否填寫了調查問卷。構建這個模型的資料是從那些真實的已填寫調查問卷的客戶中得來的。


這份資料包括客戶的人口統計學資料以及使用者歷史行為資料,包括與公司之間的事件和交易資料以及結果。特別需要指出的是,這些資料包括缺陷、退貨、客戶支援的記錄、解決問題的時間以及呼叫服務電話的次數,這些資料構成了特徵變數。目標變數是從調查問卷得來的度的分數。比較典型的是這個分數是從0到5或者是從0到10的有一位到兩位小數的數字。


如果分數是離散的值,比如1、2、3、4、5,那麼我們可以使用Gordon分類來處理。在我們的用例中,我們假定分數值是連續的,因此我們將會使用線性迴歸演算法。利用人口統計學和歷史的資料,構建一個可以用來預測客戶滿意度分數的線性迴歸方程。這個用例的行動計劃是:利用真正回答了調查問卷的客戶的資料構建一個預測模型,來預測客戶滿意度分數。我們需要將調查資料進行規範化,從而去掉可能會影響整體模型的異常值,然後我們將模型應用到所有客戶,來發現客戶的滿意度評分。


640?wx_fmt=jpeg

然後我們的客戶支援團隊得到一個最不滿意的客戶列表,可以去主動聯絡這些客戶,詢問他們使用產品的感受和問題或者最終給他們一些折扣。


將問題進行型別分組

640?wx_fmt=png


客戶支援團隊每天在處理不同的問題,有些問題會被經常問到並且簡單直接,技術工程師甚至可以在客戶解釋完問題之前就能給出解決方案。另外一些問題則不那麼常見並且比較複雜,需要多次的電話溝通以及現場服務才能解決。一個網路連線問題是非常容易診斷的,但是診斷一個膝上型電腦的藍屏問題則要困難得多。實際上人力資源成本是非常高的,因此企業需要找到優化使用人力資源的方法。


這包含對一些問題提供線上幫助,包括對技術支援團隊更嚴格的培訓或者對複雜問題建立新的專家職位。為了幫助企業做這些決策,需要基於相似的屬性對問題進行分組。這是這個用例的目標,對於一個問題型別列表,企業需要識別邏輯的問題分組,從而使用它們去開發優化那些消耗最少人力資源的解決方案。


這個用例的資料,是從技術支援團隊記錄下來的問題庫資料中得到的問題統計資料。問題資料按照問題型別做彙總。特徵資料是解決問題的平均時間、平均電話的次數、替換率等等。既然我們要建立邏輯分組,我們將要使用K-Means聚類演算法或者相關的一些變種演算法。通過多次採用不同的K值進行試驗來衡量出一個最佳的分組數量。


利用問題統計資料,我們能夠將相似的問題進行分組。行動計劃如下:當問題型別已經被分組,我們將會分析每個分組去發現分組裡邊的相似性,比如解決問題花了更長的時間或者非常低的發生率。然後我們就可以得出優化解決方案的計劃,例如在我們的網站上提供自幫助、在YouTube提供視訊或者對這個問題領域的技術人員做更好的培訓。


640?wx_fmt=jpeg


作為一個企業,我們想要達到客戶支援的效率和有效性的最大化。這個用例幫助我們達到這個目標。


問題分組用例

640?wx_fmt=png

我們如何能夠將相似的問題分組到不同的問題型別,然後在組裡對它們進行分析來判斷是否有任何模式,緊接著採取某些行動去解決效率和有效性問題?


640?wx_fmt=jpeg


載入資料集

640?wx_fmt=png

In [1]:


%matplotlib inline

from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import os
import matplotlib.pylab as plt
from sklearn.model_selection  import train_test_split
from sklearn.cluster import KMeans
import sklearn.metrics

raw_data = pd.read_csv("issues.csv")
raw_data.dtypes


Out [1]:


PROBLEM_TYPE             object
COUNT                     int64
AVG_CALLS_TO_RESOLVE    float64
AVG_RESOLUTION_TIME       int64
REOCCUR_RATE            float64
REPLACEMENT_RATE        float64
dtype: object


這個資料集對於每個唯一的問題型別有一條記錄,每個型別包含一些度量值,例如總量,解決問題平均電話次數,解決問題平均時常等等。


raw_data.head()


640?wx_fmt=jpeg


將資料分到不同的相似聚類組中

640?wx_fmt=png


現在我們將會使用K-Means聚類去根據屬性將資料聚類到不同的組當中。首先,我們需要決定分組的最優的數量,為此,我們採用膝部法來測試確定什麼時候這個膝狀發生。(參照https://datasciencelab.wordpress.com/2013/12/27/finding-the-k-in-k-means-clustering/)


In [3]:


clust_data = raw_data.drop("PROBLEM_TYPE",axis=1)

#Finding optimal no. of clusters
from scipy.spatial.distance import cdist
clusters=range(1,10)
meanDistortions=[]

for k in clusters:
   model=KMeans(n_clusters=k)
   model.fit(clust_data)
   prediction=model.predict(clust_data)
   meanDistortions.append(sum(np.min(cdist(clust_data, model.cluster_centers_, 'euclidean'), axis=1)) / clust_data.shape[0])

#plt.cla()
plt.plot(clusters, meanDistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Average distortion')
plt.title('Selecting k with the Elbow Method')


640?wx_fmt=jpeg


Out [3]:


觀察那些點,我們發現膝狀發生在cluster=3的時候,這是聚類的最佳的數量,因此我們在實際操作中將會設定聚類的數量是3。然後我們在原始的資料集上新增聚類的ID。


In [4]:


#Optimal clusters is 3
final_model=KMeans(3)
final_model.fit(clust_data)
prediction=final_model.predict(clust_data)

#Join predicted clusters back to raw data
raw_data["GROUP"] = prediction
print("Groups Assigned : \n")
raw_data[["GROUP","PROBLEM_TYPE"]]
Groups Assigned :


640?wx_fmt=jpeg


對分組進行分析

640?wx_fmt=png


我們現在可以做一系列的箱型圖去看這些不同組在不同的特徵變數上的差異。我們從count先開始。


In [5]:


plt.cla()
plt.boxplot([[raw_data["COUNT"][raw_data.GROUP==0]],
             [raw_data["COUNT"][raw_data.GROUP==1]] ,
               [raw_data["COUNT"][raw_data.GROUP==2]] ],
           labels=('GROUP 1','GROUP 2','GROUP 3'))


Out[5]:


{'boxes': [,
 ,
 ],
'caps': [,
 ,
 ,
 ,
 ,
 ],
'fliers': [,
 ,
 ],
'means': [],
'medians': [,
 ,
 ],
'whiskers': [,
 ,
 ,
 ,
 ,
 ]}


640?wx_fmt=jpeg


我們可以看到在不同的分組中問題的數量有明顯的區別。


接下來我們看解決問題的平均電話數量。


In [6]:


#Now for Avg. Calls to resolve
plt.cla()
plt.boxplot([[raw_data["AVG_CALLS_TO_RESOLVE"][raw_data.GROUP==0]],
             [raw_data["AVG_CALLS_TO_RESOLVE"][raw_data.GROUP==1]] ,
               [raw_data["AVG_CALLS_TO_RESOLVE"][raw_data.GROUP==2]] ],
           labels=('GROUP 1','GROUP 2','GROUP 3'))


Out[6]:


{'boxes': [,
 ,
 ],
'caps': [,
 ,
 ,
 ,
 ,
 ],
'fliers': [,
 ,
 ],
'means': [],
'medians': [,
 ,
 ],
'whiskers': [,
 ,
 ,
 ,
 ,
 ]}


640?wx_fmt=jpeg


Group 2基本上不需要任何時間就能解決,這表明問題是非常簡單和直接的。企業需要去看看這些問題然後給客戶提供一個自服務的路徑(產品幫助、線上幫助)而不是浪費客戶代表的時間。


In [7]:


plt.cla()
plt.boxplot([[raw_data["REOCCUR_RATE"][raw_data.GROUP==0]],
             [raw_data["REOCCUR_RATE"][raw_data.GROUP==1]] ,
               [raw_data["REOCCUR_RATE"][raw_data.GROUP==2]] ],
           labels=('GROUP 1','GROUP 2','GROUP 3'))


Out[7]:


{'boxes': [,
 ,
 ],
'caps': [,
 ,
 ,
 ,
 ,
 ],
'fliers': [,
 ,
 ],
'means': [],
'medians': [,
 ,
 ],
'whiskers': [,
 ,
 ,
 ,
 ,
 ]}


640?wx_fmt=jpeg


Group 2有非常高的複發率,這些問題需要進行分析去看看產品質量如何改進以防止這些問題再次發生。


In [8]:


plt.cla()
plt.boxplot([[raw_data["REPLACEMENT_RATE"][raw_data.GROUP==0]],
             [raw_data["REPLACEMENT_RATE"][raw_data.GROUP==1]] ,
               [raw_data["REPLACEMENT_RATE"][raw_data.GROUP==2]] ],
           labels=('GROUP 1','GROUP 2','GROUP 3'))


Out[8]:


{'boxes': [,
 ,
 ],
'caps': [,
 ,
 ,
 ,
 ,
 ],
'fliers': [,
 ,
 ],
'means': [],
'medians': [,
 ,
 ],
'whiskers': [,
 ,
 ,
 ,
 ,
 ]}


640?wx_fmt=jpeg


Group 1具有非常廣的替換率,它不能給出任何實際可以操作的模式。


Group 2沒有任何的替換,這是非常棒的。現在看到的組級別的一些傾向,我們可以基於這些分析做一些組級別的決策。例如Group 2呼叫了很多次,但是解決基本不需要花時間,因此我們可以對Group 2利用自服務。Group 1則不同,呼叫的次數少,但是花了很多的時間去解決,並且有很高的替換率以及複發率,我們可能需要去看看產品是否有問題或者已修復問題是否還在發生。


這就是我們如何利用聚類和預測分析去將我們的問題進行分組,然後基於組進行分析。


作者:Ryan Aminollahi

原文:https://towardsdatascience.com/predictive-customer-analytics-part-iv-ab15843c8c63

譯者:TalkingData研發副總裁 閆志濤


640?wx_fmt=jpeg


金猿榜往期的獲獎名單,將會在峰會現場隆重發布,期待我們的見面?


640?wx_fmt=gif


640?wx_fmt=jpeg

相關文章