通過客戶流失預測案例感悟數據分析設計方法思考——數據驅動、AI驅動

國際著名的諮詢公司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月





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章