一、背景及挖掘目標
1、行業背景
隨着大數據的來臨,傳統的商業模式正在被一個新的營銷模式—“數據化營銷”所替代,採取不同的營銷策略,將有限的資源集中在高價值的客戶上,實現企業利潤的最大化目標。
面對激烈的市場競爭,國內的某航空公司面臨着旅客流失、競爭力下降、航空資源未充分利用等危機,通過建立合理的客戶價值評估模型,對客戶進行分羣,分析比較不同客戶羣的客戶價值,並制定相應的營銷策略,對不同的客戶羣提供個性化的客戶服務是非常必要的。
2、挖掘目標
⑴藉助航空公司的客戶數據,對客戶進行分類;
⑵對不同類的客戶類別進行特徵分析,比較不同類客戶的客戶價值;
⑶從營銷角度講,客戶價值分析實際上是一個市場細分問題,解決市場細分問題比較常用的方法是聚類分析;
⑷對不同價值的客戶類別提供個性化的服務,並且制定相應的營銷策略,使得公司的利益最大化。
二、分析方法及流程
1、分析方法
RFM模型是衡量客戶價值和客戶創利能力的重要工具和手段,它通過一個客戶的近期購買行爲、購買的總體頻次以及購買的總體金額三個指標來描述客戶的價值狀況。分別爲:最近消費時間間隔(Recently)、消費頻率(Frequency)、消費金額(Money)。
在RFM模型的基礎上,結合具體的業務背景,來對航空公司進行客戶價值分析。我們選擇在一定時間內累積的飛行里程數(M)和客戶在一定時間內乘坐艙位對應的折扣係數的平均值C來代替消費金額指標。此外,航空公司會員入會時間的長短在一定時間內會影響客戶價值,模型中增加了客戶關係長度指標L。
利用客戶入會時長L、消費時間間隔R、消費頻率F、飛行里程數M以及折扣係數的平均值C來作爲航空公司識別客戶價值指標,見表1,記爲LRFMC模型。
表1:指標含義
指標 | 對應含義 |
L | 會員入會時間距離觀測窗口結束的月數 |
R | 客戶最後一次乘坐飛機距離觀測窗口結束的月數 |
F | 客戶在觀測窗口乘坐飛機的次數 |
M | 客戶在觀測窗口內累計飛行里程數 |
C | 客戶在觀測窗口乘坐艙位對應的折扣係數的平均值C |
採用聚類分析的方法識別客戶價值。通過對航空公司客戶價值LRFMC五個指標進行K-Means聚類,識別最有價值客戶。
2、分析流程
2.1分析流程
⑴從航空公司的數據源中進行數據提取;
⑵對數據進行數據探索以及數據預處理工作,包括數據的缺失值及異常值處理、數據的屬性規約以及數據的變換等;
⑶對處理過的數據進行建模工作,基於旅客價值LRFMC模型進行客戶分羣,對各個客戶進行特徵提取,識別出有價值的客戶;
⑷ 對不同價值的客戶類別提供個性化的服務,並且制定相應的營銷策略,使得公司的利益最大化。
具體數據分析流程如圖1所示:
圖1:LRFMC模型建模的總體流程
2.2數據抽取
選取時間寬度爲兩年的數據進行分析,抽取觀測窗口有乘機記錄的客戶的詳細數據形成歷史數據。對後續新增客戶的信息,按照後續新增數據最新的時間節點作爲結束時間,形成新增數據。
2.3數據探索性分析
主要是進行缺失值分析和異常值分析,通過對數據的觀察,發現原始數據中存在票價爲空值,票價最小值爲0、折扣率最小值爲0、總飛行公里數大於0的記錄,這個都是屬於缺失值和異常值的範疇。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #對數據進行基本的探索,返回缺失值以及最大值,最小值
- import pandas as pd
- datafile = 'data/air_data.csv' #航空原始數據文件
- resultfile = 'explore_result.xls' #數據探索結果文件
- #將數據導入
- data = pd.read_csv(datafile,encoding='utf-8')
- #查看數據的各個屬性的相關信息
- data.info()
- #將每個屬性的描述性統計量展示
- explore=data.describe(percentiles=[],include='all').T
- #計算屬性對應的空值個數
- explore['null']=len(data)-explore['count']
- #選取部分探索內容
- explore = explore[['null','max','min']]
- #屬性列名的重命名
- explore.columns = [u'空值記錄數',u'最大值',u'最小值']
- #對索引命名
- explore.index.name=u'屬性名稱'
- #將探索的結果保存到excel文件
- explore.to_excel(resultfile,header=True)
- <textarea>
數據探索分析結果表(部分)
2.4數據預處理
2.4.1數據清洗
由於原始數據量比較大,上述被定義爲缺失值和異常值的樣本量很小,對問題的分學習影響不大,因此選擇的是剔除缺失值和異常值。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #數據清洗,過濾掉不符合規則的數據
- import pandas as pd
- datafile = 'data/air_data.csv'#航空數據源文件
- cleanedfile = 'cleaned_data.csv'#數據被清洗後保存的文件
- #導入航空客戶數據原文件
- data = pd.read_csv(datafile,encoding='utf-8')
- #刪除票價爲空的記錄
- data = data[(data['SUM_YR_1'].notnull())&(data['SUM_YR_2'].notnull())]
- #刪除異常記錄:保留票價非0,或者平均折扣率和總飛行公里數同時爲0的記錄
- index1 = (data['SUM_YR_1']!=0)|(data['SUM_YR_2']!=0)
- index2 = (data['SEG_KM_SUM']==0)&(data['avg_discount']==0)
- data = data[index1|index2]
- #導出結果
- data.to_csv(cleanedfile)
- <textarea>
2.4.2屬性規約
基於航空公司客戶價值的LRFMC模型,選擇與LRFMC指標相關的6個屬性,其中選取了LOAD_TIME(觀測窗口的結束時間),FFP_DATE(觀測窗口的開始時間),LAST_TO_END(最後一次乘機時間至觀測窗口結束時長),FLIGHT_COUNT(觀測窗口的飛行次數),SEG_KM_SUM(觀測窗口的總飛行公里數),avg_discount(平均折扣率),刪除其餘不必要的屬性。
2.4.3數據變換
⑴屬性構造
由於在原始數據並沒有完整的給出LRFMC模型的5個指標,需要通過原始變量提煉相應指標,具體的計算公式如下:
會員入會時間=觀測窗口的結束時間-觀測窗口的開始時間(單位:月)
L=LOAD_TIME- FFP_DATE
客戶最近一次乘坐飛機距離窗口結束的月數=最後一次乘機時間至觀測窗口結束時長(單位:月)
R= LAST_TO_END
客戶在觀測窗口乘坐飛機的次數=觀測窗口的飛行次數(單位:次)
F= FLIGHT_COUNT
客戶在觀測時間內的累計飛行里程=觀測窗口的總飛行公里數(單位:公里)
M= SEG_KM_SUM
客戶在觀測時間內乘坐艙位所對應的的折扣係數的平均值=平均折扣率(單位:無)
C= avg_discount
⑵數據的標準化處理
通過R語言中的summary函數來查看每個指標數據的分佈情況,其數據取值範圍如表2所示,發現五個指標的數據差異較大,爲了消除數據數量級較大帶來的影響,對數據進行了標準化處理。
表2:LRFMC指標取值範圍
屬性名稱 | L | R | F | M | C |
最大值 | 12.17 | 1.0 | 2.00 | 368 | 0.0000 |
中位數 | 42.57 | 105.0 | 7.00 | 10198 | 0.7121 |
均值 | 49.62 | 172.5 | 11.97 | 17320 | 0.7221 |
最小值 | 114.57 | 731.0 | 213.00 | 580717 | 1.5000 |
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #屬性規約,刪除冗餘屬性,只保留相關屬性
- import pandas as pd
- import numpy as np
- datafile = 'cleaned_data.csv'#被清洗後的航空數據文件
- resultfile = 'scale_data.csv'#數據被屬性規約後保存的文件
- #導入被清洗過後的數據文件(選取的數據子集)
- data=pd.read_csv(datafile,encoding='utf-8')
- #編寫函數:屬性規約、數據變換函數
- def reduction_data(data):
- data = data[['LOAD_TIME','FFP_DATE','FLIGHT_COUNT','avg_discount','SEG_KM_SUM','LAST_TO_END']]
- #數據變換:將結束時間轉換爲時間類型
- d_loadtime=pd.to_datetime(data['LOAD_TIME'])
- #數據變換:將入會時間轉換爲時間類型
- d_ffpdate=pd.to_datetime(data['FFP_DATE'])
- #客戶入會時長需要另外計算,入會時長按照月來進行計算
- recency=d_loadtime-d_ffpdate #得到的是天數
- temp_data=data.copy()
- #將入會時長由天數轉爲月數
- temp_data['L']=recency.map(lambda x: x / np.timedelta64(30 * 24 * 60, 'm'))
- temp_data['R'] = data['LAST_TO_END']
- temp_data['F'] = data['FLIGHT_COUNT']
- temp_data['M'] = data['SEG_KM_SUM']
- temp_data['C'] = data['avg_discount']
- new_data = temp_data[['L', 'R', 'F', 'M', 'C']]
- return new_data
-
- #調用屬性規約、變換函數,得到建模數據new_data
- new_data = reduction_data(data)
- #查看LRFMC各個指標的取值範圍,判斷是否需要進行標準化
- new_data.describe()
- <textarea>
- <textarea readonly="readonly" name="code" class="python">
- #由以上結果可知5個指標的取值範圍差異太大,需要標準化處理
- ascore_data=(new_data-new_data.mean(axis=0))/(new_data.std(axis=0))
- #將屬性列名重命名
- ascore_data.columns=['ZL','ZR','ZF','ZM','ZC']
- #將標準化後的數據保存到excel文件
- ascore_data.to_csv(resultfile,index=False)
- <textarea>
2.4.4模型構建
LRFMC模型主要由兩個部分組成,第一部分是根據航空公司業務指標,對客戶進行聚類分羣;第二部分是對每個業務羣進行特徵分析,分析客戶價值,並採取特定的營銷手段,來使得公司的利潤最大化。
- <textarea readonly="readonly" name="code" class="python">
- #-*- coding: utf-8 -*-
- #K-Means聚類算法
- import pandas as pd
- from sklearn.cluster import KMeans #導入K均值聚類算法
- inputfile = 'scale_data.csv'
- #聚類數目
- k=5
- #將標準化後的數據導入建模
- data = pd.read_csv(inputfile,encoding="utf-8")
- #建立模型
- kmodel=KMeans(n_clusters=k,n_jobs=4)
- #訓練模型
- kmodel.fit(data)
- r1 = pd.Series(kmodel.labels_)
- #每個聚類對應的樣本個數
- r1=r1.value_counts()
- #聚類的中心
- r2=pd.DataFrame(kmodel.cluster_centers_)
- #將r1和r2進行列合併
- r=pd.concat([r2,r1],axis=1)
- #列名命名
- r.columns=list(data.columns)+['聚類個數']
- #起索引名稱
- r.index.name='聚類類別'
- #重新設置索引
- r.index=([u'客戶羣體1',u'客戶羣體2',u'客戶羣體3',u'客戶羣體4',u'客戶羣體5'])
- #將聚類結果保存到excel文件
- r.to_excel('result_cluster.xls')
- <textarea>
⑴客戶聚類結果
對數據進行聚類分羣如下表所示:
表3:客戶聚類結果
聚類類別 | 聚類個數 | 聚類中心 | ||||
ZL | ZR | ZF | ZM | ZC | ||
客戶羣1 | 5336 | 0.48296123 | -0.79944875 | 2.48351216 | 2.42472275 | 0.3087468 |
客戶羣2 | 15745 | 1.16049784 | -0.37732916 | -0.37732916 | -0.09498699 | -0.1557095 |
客戶羣3 | 12134 | -0.31370040 | 1.68554920 | -0.57392324 | -0.53674300 | -0.1743790 |
客戶羣4 | 24666 | -0.70030743 | -0.41494899 | -0.16116894 | -0.16107783 | -0.2530821 |
客戶羣5 | 4170 | 0.05542063 | -0.00249783 | -0.22544385 | -0.22944009 | 2.1972694 |
⑵客戶價值分析
圖2:客戶羣特徵分析圖
重要保持客戶(客戶羣1):
這類客戶的平均折扣率(C)較高(一般所乘航班的艙位的等級較高),最近乘坐過本公司航班(R)低,乘坐的次數(F)或里程(M)較高。他們是公司的高價值客戶,是最理想的客戶類型,對航空公司的貢獻率大,但是所佔的比例較小。
航空公司應當優先將資源投放在他們身上,對他們做到一對一精準營銷,比如提供相應的優惠政策,提高這類客戶的忠誠度和滿意度,儘可能延長這類客戶的高消費水平。
重要發展客戶(客戶羣5):
這類客戶的平均折扣率(C)較高,最近乘坐過本公司航班(R)低,乘坐的次數(F)或里程(M)較低。這類客戶入會時長(L)短,他們是公司的潛在價值客戶。
航空公司在運營過程中也要相應加大對這部分客戶的投入,比如以短信和郵件的方式詢問客戶是否滿意、提供適當的優惠服務等,加強這類客戶的滿意度,使他們逐漸成爲公司的忠實客戶。
重要挽留客戶(客戶羣2):
這類客戶的平均折扣率(C)、乘坐的次數(F)或里程(M)較高,但是已經較長時間已經沒有乘坐過本公司航班,即(R)較高或者乘坐的頻率變小,他們是公司的重要挽留客戶。
航空公司在運營過程中要積極推測這類客戶的異常情況,進行競爭分析,觀察其他航空公司有什麼營銷策略,然後採取有針對性的營銷手段,延長客戶的生命週期。
一般和低價值客戶(客戶羣3、4):
這類客戶的平均折扣率(C)較低,最近乘坐過本公司航班(R)低,乘坐的次數(F)或里程(M)較低。入會時長(L)也較短,因此可能只是在機票打折的時候纔會乘坐本航班。
重要發展客戶、重要保持客戶、重要挽留客戶可以稱作爲客戶生命週期管理中的發展期、穩定期、衰退期三個階段。
⑶模型應用
①會員的升級和保級
對那些接近但尚未達到的高消費客戶採取一定的促銷活動,刺激他們通過消費達到相應的升級標準。
②首次兌現
對那些接近但尚未達到首次兌現機票的會員,對他們進行提醒,使他們達到首次兌現標準。
三、數據清洗、建模、評估的個人總結
1、 數據簡單查看
(1)查看數據的維度:shape
(2)查看數據的屬性(列名):columns
(3)查看數據類型:info
(4)查看前5列:head()
2、 數據缺失值處理
(1)查看數據的缺失值情況
explore=data.describe(percentiles=[],include=’all’).T
explore[‘null’]=len(data)-explore[‘count’]
explore=explore[[‘null’,’min’,’max’]]
(2)缺失值的處理
1.插補法:
用該屬性的平均值/中位數/衆數進行插補data[1].fillna(data[1].mean())
用固定值data.fillna(value=0)
最近鄰插補法 data[1].fillna(method=”ffill|bfill”)
2.直接刪除data.dropna() #將函數有缺失值的一行記錄刪除
3.保留缺失值不處理
3、數據異常值處理
(1)describe()函數進行簡單查看,比如:最大值、最下值等
(2)boxplot()函數繪製箱線圖
(3)異常值處理
刪除:將函數異常值的記錄刪除
視爲缺失值來處理
平均值修正:可用前後兩個觀測值的平均值修正
保留不處理
4、數據變換
(1)結合業務先刪除那些和分析無關的指標
(2)corr()函數計算數據樣本的相關係數矩陣
(3)刪除重複值
#查看c1和c2列重複數據和非重複數據的計數分佈
df.duplicated(subset=[‘c1’,’c2’],keep=”first”).value_counts()
#刪除後面重複值,默認保留第一個
df.drop_duplicates(subset=[“c1”,”c2”],keep=”first”,inplace=True)
(4)將數據轉換成適當的格式,以適應數據挖掘任務及算法
(5)將數據標準化
注:不同評價指標往往有不同的量綱,數值間的差異可能很大,不進行處理可能會影響到數據分析的結果。
最小——最大規範化 (data-data.min())/ (data.max()-data.min())
零——均值規範化 (data-data.mean()) /data.std()
5、模型評估
(1)混淆矩陣
查準率/準確率 = (挑出的西瓜有多少比例是好瓜)
查全率/召回率 = (好瓜中有多少比例被挑選出來)
(2)ROC曲線
真正率 = (查全率)——> 縱座標
假正率 = (1-真反率)——>橫座標
(3)AUC值
被定義爲ROC曲線下的面積,這個值不會大於1,AUC作爲數值可以直觀評價分類器的好壞,值越大越好。