
數(shù)據(jù)挖掘實戰(zhàn):帶你做客戶價值分析(附代碼)
背景與挖掘目標
1. 背景
航空公司業(yè)務(wù)競爭激烈,從產(chǎn)品中心轉(zhuǎn)化為客戶中心
針對不同類型客戶,進行精準營銷,實現(xiàn)利潤最大化
建立客戶價值評估模型,進行客戶分類,是解決問題的辦法
2. 挖掘目標
借助航空公司客戶數(shù)據(jù),對客戶進行分類
對不同的客戶類別進行特征分析,比較不同類客戶的客戶價值
對不同價值的客戶類別提供個性化服務(wù),制定相應(yīng)的營銷策略
詳情數(shù)據(jù)見數(shù)據(jù)集內(nèi)容中的air_data.csv和客戶信息屬性說明。
分析方法與過程
1. 分析方法
首先,明確目標是客戶價值識別
識別客戶價值,應(yīng)用最廣泛的模型是三個指標(消費時間間隔(Recency),消費頻率(Frequency),消費金額(Monetary))
以上指標簡稱RFM模型,作用是識別高價值的客戶
消費金額,一般表示一段時間內(nèi),消費的總額。但是,因為航空票價收到距離和艙位等級的影響,同樣金額對航空公司價值不同
因此,需要修改指標。選定變量,艙位因素=艙位所對應(yīng)的折扣系數(shù)的平均值=C,距離因素=一定時間內(nèi)積累的飛行里程=M
再考慮到,航空公司的會員系統(tǒng),用戶的入會時間長短能在一定程度上影響客戶價值,所以增加指標L=入會時間長度=客戶關(guān)系長度
總共確定了五個指標,消費時間間隔R,客戶關(guān)系長度L,消費頻率F,飛行里程M和折扣系數(shù)的平均值C
以上指標,作為航空公司識別客戶價值指標,記為LRFMC模型
如果采用傳統(tǒng)的RFM模型,如下圖。它是依據(jù),各個屬性的平均值進行劃分,但是,細分的客戶群太多,精準營銷的成本太高。
綜上,這次案例,采用聚類的辦法進行識別客戶價值,以LRFMC模型為基礎(chǔ)
本案例,總體流程如下圖
2.挖掘步驟
從航空公司,選擇性抽取與新增數(shù)據(jù)抽取,形成歷史數(shù)據(jù)和增量數(shù)據(jù)
對步驟一的兩個數(shù)據(jù),進行數(shù)據(jù)探索性分析和預(yù)處理,主要有缺失值與異常值的分析處理,屬性規(guī)約、清洗和變換
利用步驟2中的已處理數(shù)據(jù)作為建模數(shù)據(jù),基于旅客價值的LRFMC模型進行客戶分群,對各個客戶群再進行特征分析,識別有價值客戶
針對模型結(jié)果得到不同價值的客戶,采用不同的營銷手段,指定定制化的營銷服務(wù),或者針對性的優(yōu)惠與關(guān)懷。(重點維護老客戶)
3. 數(shù)據(jù)抽取
選取,2014-03-31為結(jié)束時間,選取寬度為兩年的時間段,作為觀測窗口,抽取觀測窗口內(nèi)所有客戶的詳細數(shù)據(jù),形成歷史數(shù)據(jù)
對于后續(xù)新增的客戶信息,采用目前的時間作為重點,形成新增數(shù)據(jù)
4. 探索性分析
本案例的探索分析,主要對數(shù)據(jù)進行缺失值和異常值分析
發(fā)現(xiàn),存在票價為控制,折扣率為0,飛行公里數(shù)為0。票價為空值,可能是不存在飛行記錄,其他空值可能是,飛機票來自于積分兌換等渠道
查找每列屬性觀測值中空值的個數(shù)、最大值、最小值的代碼如下
import pandas as pd
datafile= r'/home/kesci/input/date27730/air_data.csv' #航空原始數(shù)據(jù),第一行為屬性標簽
resultfile = r'/home/kesci/work/test.xls' #數(shù)據(jù)探索結(jié)果表
data = pd.read_csv(datafile, encoding = 'utf-8') #讀取原始數(shù)據(jù),指定UTF-8編碼(需要用文本編輯器將數(shù)據(jù)裝換為UTF-8編碼)
explore = data.describe(percentiles = [], include = 'all').T #包括對數(shù)據(jù)的基本描述,percentiles參數(shù)是指定計算多少的分位數(shù)表(如1/4分位數(shù)、中位數(shù)等);T是轉(zhuǎn)置,轉(zhuǎn)置后更方便查閱
print(explore)
explore['null'] = len(data)-explore['count'] #describe()函數(shù)自動計算非空值數(shù),需要手動計算空值數(shù)
explore = explore[['null', 'max', 'min']]
explore.columns = [u'空值數(shù)', u'最大值', u'最小值'] #表頭重命名
print('-----------------------------------------------------------------以下是處理后數(shù)據(jù)')
print(explore)
'''這里只選取部分探索結(jié)果。
describe()函數(shù)自動計算的字段有count(非空值數(shù))、unique(唯一值數(shù))、top(頻數(shù)最高者)、freq(最高頻數(shù))、mean(平均值)、std(方差)、min(最小值)、50%(中位數(shù))、max(最大值)'''
-----------------------------------------------------------------以下是處理前數(shù)據(jù)
count unique top freq mean std
MEMBER_NO 62988 NaN NaN NaN 31494.5 18183.2
FFP_DATE 62988 3068 2011/01/13 184 NaN NaN
FIRST_FLIGHT_DATE 62988 3406 2013/02/16 96 NaN NaN
GENDER 62985 2 男 48134 NaN NaN
FFP_TIER 62988 NaN NaN NaN 4.10216 0.373856
WORK_CITY 60719 3310 廣州 9385 NaN NaN
WORK_PROVINCE 59740 1185 廣東 17507 NaN NaN
WORK_COUNTRY 62962 118 CN 57748 NaN NaN
...
-----------------------------------------------------------------以下是處理后數(shù)據(jù)
空值數(shù) 最大值 最小值
MEMBER_NO 0 62988 1
FFP_DATE 0 NaN NaN
FIRST_FLIGHT_DATE 0 NaN NaN
GENDER 3 NaN NaN
FFP_TIER 0 6 4
WORK_CITY 2269 NaN NaN
WORK_PROVINCE 3248 NaN NaN
WORK_COUNTRY 26 NaN NaN
AGE 420 110 6
LOAD_TIME 0 NaN NaN
FLIGHT_COUNT 0 213 2
BP_SUM 0 505308 0
...
5. 數(shù)據(jù)預(yù)處理
數(shù)據(jù)清洗
丟棄票價為空記錄
丟棄票價為0、平均折扣率不為0、總飛行公里數(shù)大于0的記錄
import pandas as pd
datafile= '/home/kesci/input/date27730/air_data.csv' #航空原始數(shù)據(jù),第一行為屬性標簽
cleanedfile = '' #數(shù)據(jù)清洗后保存的文件
data = pd.read_csv(datafile,encoding='utf-8') #讀取原始數(shù)據(jù),指定UTF-8編碼(需要用文本編輯器將數(shù)據(jù)裝換為UTF-8編碼)
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] #票價非空值才保留
#只保留票價非零的,或者平均折扣率與總飛行公里數(shù)同時為0的記錄。
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) #該規(guī)則是“與”,書上給的代碼無法正常運行,修改'*'為'&'
data = data[index1 | index2 | index3] #該規(guī)則是“或”
print(data)
# data.to_excel(cleanedfile) #導(dǎo)出結(jié)果
————————————————————以下是處理后數(shù)據(jù)————————
MEMBER_NO FFP_DATE FIRST_FLIGHT_DATE GENDER FFP_TIER \
0 54993 2006/11/02 2008/12/24 男 6
1 28065 2007/02/19 2007/08/03 男 6
2 55106 2007/02/01 2007/08/30 男 6
3 21189 2008/08/22 2008/08/23 男 5
4 39546 2009/04/10 2009/04/15 男 6
5 56972 2008/02/10 2009/09/29 男 6
6 44924 2006/03/22 2006/03/29 男 6
7 22631 2010/04/09 2010/04/09 女 6
8 32197 2011/06/07 2011/07/01 男 5
9 31645 2010/07/05 2010/07/05 女 6
6. 屬性規(guī)約
原始數(shù)據(jù)中屬性太多,根據(jù)航空公司客戶價值LRFMC模型,選擇與模型相關(guān)的六個屬性
刪除其他無用屬性,如會員卡號等等
def reduction_data(data):
data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']]
# data['L']=pd.datetime(data['LOAD_TIME'])-pd.datetime(data['FFP_DATE'])
# data['L']=int(((parse(data['LOAD_TIME'])-parse(data['FFP_ADTE'])).days)/30)
d_ffp = pd.to_datetime(data['FFP_DATE'])
d_load = pd.to_datetime(data['LOAD_TIME'])
res = d_load - d_ffp
data2=data.copy()
data2['L'] = res.map(lambda x: x / np.timedelta64(30 * 24 * 60, 'm'))
data2['R'] = data['LAST_TO_END']
data2['F'] = data['FLIGHT_COUNT']
data2['M'] = data['SEG_KM_SUM']
data2['C'] = data['avg_discount']
data3 = data2[['L', 'R', 'F', 'M', 'C']]
return data3
data3=reduction_data(data)
print(data3)
————————————以下是以上代碼處理后數(shù)據(jù)————————————
L R F M C
0 90.200000 1 210 580717 0.961639
1 86.566667 7 140 293678 1.252314
2 87.166667 11 135 283712 1.254676
3 68.233333 97 23 281336 1.090870
4 60.533333 5 152 309928 0.970658
5 74.700000 79 92 294585 0.967692
6 97.700000 1 101 287042 0.965347
7 48.400000 3 73 287230 0.962070
8 34.266667 6 56 321489 0.828478
7. 數(shù)據(jù)變換
意思是,將原始數(shù)據(jù)轉(zhuǎn)換成“適當”的格式,用來適應(yīng)算法和分析等等的需要
本案例,主要采用數(shù)據(jù)變換的方式為屬性構(gòu)造和數(shù)據(jù)標準化 3.需要構(gòu)造LRFMC的五個指標
L=LOAD_TIME-FFP_DATE(會員入會時間距觀測窗口結(jié)束的月數(shù)=觀測窗口的結(jié)束時間-入會時間(單位:月))
R=LAST_TO_END(客戶最近一次乘坐公司距觀測窗口結(jié)束的月數(shù)=最后一次。。。)
F=FLIGHT_COUNT(觀測窗口內(nèi)的飛行次數(shù))
M=SEG_KM_SUM(觀測窗口的總飛行里程)
C=AVG_DISCOUNT(平均折扣率)
def zscore_data(data):
data = (data - data.mean(axis=0)) / data.std(axis=0)
data.columns = ['Z' + i for i in data.columns]
return data
data4 = zscore_data(data3)
data4
————————————以下是以上代碼處理后數(shù)據(jù)————————————
ZL ZR ZF ZM ZC
0 1.435707 -0.944948 14.034016 26.761154 1.295540
1 1.307152 -0.911894 9.073213 13.126864 2.868176
2 1.328381 -0.889859 8.718869 12.653481 2.880950
3 0.658476 -0.416098 0.781585 12.540622 1.994714
4 0.386032 -0.922912 9.923636 13.898736 1.344335
5 0.887281 -0.515257 5.671519 13.169947 1.328291
模型構(gòu)建
1. 客戶聚類
利用K-Means聚類算法對客戶數(shù)據(jù)進行客戶分群,聚成五類(根據(jù)業(yè)務(wù)理解和需要,分析與討論后,確定客戶類別數(shù)量)。
代碼如下:
inputfile = r'/home/kesci/input/date27730/zscoreddata.xls' #待聚類的數(shù)據(jù)文件
k = 5 #需要進行的聚類類別數(shù)
#讀取數(shù)據(jù)并進行聚類分析
data = pd.read_excel(inputfile) #讀取數(shù)據(jù)
#調(diào)用k-means算法,進行聚類分析
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行數(shù),一般等于CPU數(shù)較好
kmodel.fit(data) #訓(xùn)練模型
r1 = pd.Series(kmodel.labels_).value_counts()
r2 = pd.DataFrame(kmodel.cluster_centers_)
r = pd.concat([r2, r1], axis=1)
r.columns = list(data.columns) + ['類別數(shù)目']
# print(r)
# r.to_excel(classoutfile,index=False)
r = pd.concat([data, pd.Series(kmodel.labels_, index=data.index)], axis=1)
r.columns = list(data.columns) + ['聚類類別']
print(kmodel.cluster_centers_)
print(kmodel.labels_)
r
[[-0.70078704 -0.41513666 -0.1607619 -0.16049688 -0.25665898]
[-0.31411607 1.68662534 -0.57386257 -0.53661609 -0.17243195]
[ 0.48347647 -0.79941777 2.48236495 2.42356419 0.30943042]
[ 1.16033496 -0.37744106 -0.0870043 -0.09499704 -0.15836889]
[ 0.05165705 -0.00258448 -0.23089344 -0.23513858 2.17775056]]
[3 3 3 ... 3 3 3]
ZL ZR ZF ZM ZC 聚類類別
0 1.689882 0.140299 -0.635788 0.068794 -0.337186 3
1 1.689882 -0.322442 0.852453 0.843848 -0.553613 3
2 1.681743 -0.487707 -0.210576 0.158569 -1.094680 3
3 1.534185 -0.785184 0.002030 0.273091 -1.148787 3
4 0.890167 -0.426559 -0.635788 -0.685170 1.231909 4
5 -0.232618 -0.690983 -0.635788 -0.603898 -0.391293 0
6 -0.496949 1.996225 -0.706656 -0.661752 -1.311107 1
就剩下最后一步,畫圖:
def density_plot(data):
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
p=data.plot(kind='kde',linewidth=2,subplots=True,sharex=False)
[p[i].set_ylabel('密度') for i in range(5)]
[p[i].set_title('客戶群%d' %i) for i in range(5)]
plt.legend()
plt.show()
return plt
density_plot(data4)
clu = kmodel.cluster_centers_
x = [1,2,3,4,5]
colors = ['red','green','yellow','blue','black']
for i in range(5):
plt.plot(x,clu[i],label='clustre '+str(i),linewidth=6-i,color=colors[i],marker='o')
plt.xlabel('L R F M C')
plt.ylabel('values')
plt.show()
客戶群1:red,
客戶群2:green,
客戶群3:yellow,
客戶群4:blue,
客戶群5:black
客戶關(guān)系長度L,消費時間間隔R,消費頻率F,飛行里程M,折扣系數(shù)的平均值C。
橫坐標上,總共有五個節(jié)點,按順序?qū)?yīng)LRFMC。
對應(yīng)節(jié)點上的客戶群的屬性值,代表該客戶群的該屬性的程度。
2. 客戶價值分析
我們重點關(guān)注的是L,F(xiàn),M,從圖中可以看到:
客戶群4[blue] 的F,M很高,L也不低,可以看做是重要保持的客戶;
客戶群3[yellow] 重要發(fā)展客戶
客戶群1[red] 重要挽留客戶,原因:入會時間長,但是F,M較低
客戶群2[green] 一般客戶
客戶群5[black] 低價值客戶
重要保持客戶:R(最近乘坐航班)低,F(xiàn)(乘坐次數(shù))、C(平均折扣率高,艙位較高)、M(里程數(shù))高。最優(yōu)先的目標,進行差異化管理,提高滿意度。
重要發(fā)展客戶:R低,C高,F(xiàn)或M較低,潛在價值客戶。雖然說,當前價值不高,但是卻有很大的發(fā)展?jié)摿?,促使這類客戶在本公司消費和合作伙伴處消費。
重要挽留客戶:C、F、M較高,但是較長時間沒有乘坐(R)小。增加與這類客戶的互動,了解情況,采取一定手段,延長客戶生命周期。
一般與低價值客戶:C、F、M、L低,R高。他們可能是在公司打折促銷時才會乘坐本公司航班。
3. 模型應(yīng)用
會員的升級與保級(積分兌換原理相同)
會員可以分為,鉆石,白金,金卡,銀卡…
部分客戶會因為不了解自身積分情況,錯失升級機會,客戶和航空公司都會有損失
在會員接近升級前,對高價值客戶進行促銷活動,刺激他們消費達到標準,雙方獲利
4.交叉銷售
通過發(fā)行聯(lián)名卡與非航空公司各做,使得企業(yè)在其他企業(yè)消費過程中獲得本公司的積分,增強與本公司聯(lián)系,提高忠誠度。
5. 管理模式
企業(yè)要獲得長期的豐厚利潤,必須需要大量穩(wěn)定的、高質(zhì)量的客戶
維持老客戶的成本遠遠低于新客戶,保持優(yōu)質(zhì)客戶是十分重要的
精準營銷中,也有成本因素,所以按照客戶價值排名,進行優(yōu)先的,特別的營銷策略,是維持客戶的關(guān)鍵。
6.小結(jié)
本文,結(jié)合航空公司客戶價值案例的分析,重點介紹了數(shù)據(jù)挖掘算法中K-Means聚類算法的應(yīng)用。 針對,傳統(tǒng)RFM模型的不足,結(jié)合案例進行改造,設(shè)定了五個指標的LRFMC模型。最后通過聚類的結(jié)果,選出客戶價值排行,并且制定相應(yīng)策略。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03