數據挖掘實戰:帶你做客戶價值分析(附代碼)

2021-02-24 數據派THU

本文約4000字,建議閱讀7分鐘。
手把手教你利用利用KMeans聚類進行航空公司客戶價值分析。


背景與挖掘目標


1. 背景
2. 挖掘目標

詳情數據見數據集內容中的air_data.csv和客戶信息屬性說明。


分析方法與過程1. 分析方法

消費金額,一般表示一段時間內,消費的總額。但是,因為航空票價收到距離和艙位等級的影響,同樣金額對航空公司價值不同

因此,需要修改指標。選定變量,艙位因素=艙位所對應的折扣係數的平均值=C,距離因素=一定時間內積累的飛行裡程=M

再考慮到,航空公司的會員系統,用戶的入會時間長短能在一定程度上影響客戶價值,所以增加指標L=入會時間長度=客戶關係長度

總共確定了五個指標,消費時間間隔R,客戶關係長度L,消費頻率F,飛行裡程M和折扣係數的平均值C

以上指標,作為航空公司識別客戶價值指標,記為LRFMC模型



2.挖掘步驟

從航空公司,選擇性抽取與新增數據抽取,形成歷史數據和增量數據

對步驟一的兩個數據,進行數據探索性分析和預處理,主要有缺失值與異常值的分析處理,屬性規約、清洗和變換

利用步驟2中的已處理數據作為建模數據,基於旅客價值的LRFMC模型進行客戶分群,對各個客戶群再進行特徵分析,識別有價值客戶

針對模型結果得到不同價值的客戶,採用不同的營銷手段,指定定製化的營銷服務,或者針對性的優惠與關懷。(重點維護老客戶)


3. 數據抽取
4. 探索性分析

本案例的探索分析,主要對數據進行缺失值和異常值分析

發現,存在票價為控制,折扣率為0,飛行公裡數為0。票價為空值,可能是不存在飛行記錄,其他空值可能是,飛機票來自於積分兌換等渠道

查找每列屬性觀測值中空值的個數、最大值、最小值的代碼如下

import pandas as pd
datafile= r'/home/kesci/input/date27730/air_data.csv' #航空原始數據,第一行為屬性標籤
resultfile = r'/home/kesci/work/test.xls' #數據探索結果表
data = pd.read_csv(datafile, encoding = 'utf-8') #讀取原始數據,指定UTF-8編碼(需要用文本編輯器將數據裝換為UTF-8編碼)
explore = data.describe(percentiles = [], include = 'all').T #包括對數據的基本描述,percentiles參數是指定計算多少的分位數表(如1/4分位數、中位數等);T是轉置,轉置後更方便查閱
print(explore)
explore['null'] = len(data)-explore['count'] #describe()函數自動計算非空值數,需要手動計算空值數
explore = explore[['null', 'max', 'min']]
explore.columns = [u'空值數', u'最大值', u'最小值'] #表頭重命名
print('以下是處理後數據')
print(explore)
'''這裡只選取部分探索結果。
describe()函數自動計算的欄位有count(非空值數)、unique(唯一值數)、top(頻數最高者)、freq(最高頻數)、mean(平均值)、std(方差)、min(最小值)、50%(中位數)、max(最大值)'''

以下是處理前數據
                        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  
...

以下是處理後數據
                         空值數       最大值   最小值
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. 數據預處理

import pandas as pd
datafile= '/home/kesci/input/date27730/air_data.csv' #航空原始數據,第一行為屬性標籤
cleanedfile = '' #數據清洗後保存的文件
data = pd.read_csv(datafile,encoding='utf-8') #讀取原始數據,指定UTF-8編碼(需要用文本編輯器將數據裝換為UTF-8編碼)
data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] #票價非空值才保留
#只保留票價非零的,或者平均折扣率與總飛行公裡數同時為0的記錄。
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) #該規則是「與」,書上給的代碼無法正常運行,修改'*'為'&'
data = data[index1 | index2 | index3] #該規則是「或」
print(data)
# data.to_excel(cleanedfile) #導出結果

————————————————————以下是處理後數據————————
      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. 屬性規約原始數據中屬性太多,根據航空公司客戶價值LRFMC模型,選擇與模型相關的六個屬性

刪除其他無用屬性,如會員卡號等等

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)

————————————以下是以上代碼處理後數據————————————
               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. 數據變換

L=LOAD_TIME-FFP_DATE(會員入會時間距觀測窗口結束的月數=觀測窗口的結束時間-入會時間(單位:月))

R=LAST_TO_END(客戶最近一次乘坐公司距觀測窗口結束的月數=最後一次。。。)

F=FLIGHT_COUNT(觀測窗口內的飛行次數)

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

————————————以下是以上代碼處理後數據————————————
        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


模型構建
1. 客戶聚類

利用K-Means聚類算法對客戶數據進行客戶分群,聚成五類(根據業務理解和需要,分析與討論後,確定客戶類別數量)。

代碼如下:

inputfile = r'/home/kesci/input/date27730/zscoreddata.xls' #待聚類的數據文件
k = 5                       #需要進行的聚類類別數
#讀取數據並進行聚類分析
data = pd.read_excel(inputfile) #讀取數據
#調用k-means算法,進行聚類分析
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是並行數,一般等於CPU數較好
kmodel.fit(data) #訓練模型
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) + ['類別數目']
# 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

客戶關係長度L,消費時間間隔R,消費頻率F,飛行裡程M,折扣係數的平均值C。


橫坐標上,總共有五個節點,按順序對應LRFMC。


對應節點上的客戶群的屬性值,代表該客戶群的該屬性的程度。

2. 客戶價值分析

我們重點關注的是L,F,M,從圖中可以看到:

客戶群4[blue] 的F,M很高,L也不低,可以看做是重要保持的客戶;

客戶群3[yellow] 重要發展客戶

客戶群1[red] 重要挽留客戶,原因:入會時間長,但是F,M較低

客戶群2[green] 一般客戶

客戶群5[black] 低價值客戶

重要保持客戶:R(最近乘坐航班)低,F(乘坐次數)、C(平均折扣率高,艙位較高)、M(裡程數)高。最優先的目標,進行差異化管理,提高滿意度。

重要發展客戶:R低,C高,F或M較低,潛在價值客戶。雖然說,當前價值不高,但是卻有很大的發展潛力,促使這類客戶在本公司消費和合作夥伴處消費。

重要挽留客戶:C、F、M較高,但是較長時間沒有乘坐(R)小。增加與這類客戶的互動,了解情況,採取一定手段,延長客戶生命周期。

一般與低價值客戶:C、F、M、L低,R高。他們可能是在公司打折促銷時才會乘坐本公司航班。


3. 模型應用

4. 交叉銷售


通過發行聯名卡與非航空公司各做,使得企業在其他企業消費過程中獲得本公司的積分,增強與本公司聯繫,提高忠誠度。

5. 管理模式

企業要獲得長期的豐厚利潤,必須需要大量穩定的、高質量的客戶

維持老客戶的成本遠遠低於新客戶,保持優質客戶是十分重要的

精準營銷中,也有成本因素,所以按照客戶價值排名,進行優先的,特別的營銷策略,是維持客戶的關鍵。


6.小結

本文,結合航空公司客戶價值案例的分析,重點介紹了數據挖掘算法中K-Means聚類算法的應用。 針對,傳統RFM模型的不足,結合案例進行改造,設定了五個指標的LRFMC模型。最後通過聚類的結果,選出客戶價值排行,並且制定相應策略。

相關焦點

  • 玩轉地球: 如何利用SAS繪製現代化地圖(附代碼)
    地理空間數據結合其他業務數據如何被分析利用,以及如何在分析中可視化呈現一直是現代化分析平臺的一個重要方向。一方面各種地圖服務越來越多地集成到應用中,成為應用增強交互的組成部分(比如「附近的服務/人」,甚至連支付包紅包都需要呈現各種方位關係,來增強樂趣),另一方面在分析行業,如何能夠高效方便地繪製各種地圖成為一種基本需求。
  • Python數據分析:股票數據分析案例
    主要一個股票,使用時間序列模型研究按照下面的流程來研究一下其變化趨勢,看看準不準,Python代碼寫的比較優美,學習者可以研讀一下整個程序流程。
  • 綜述:《為實現預防醫學的大數據分析》
    對這些問題的明確回答是使用智能數據分析方法從大量醫療數據中發現信息。數據分析研究人員正準備在患者醫療方面促成巨大的有益進步。醫療領域的數據分析應用具有巨大的潛力。目前,數據分析、機器學習和數據挖掘使早期疾病的識別和治療成為可能。許多國家都正在實施疾病的早期監測和發現,如美國的BioSense、加拿大的CDPAC、澳大利亞的SAMSS和AIHW,以及法國的SentiWeb等。醫療數據是最有價值的數據之一,但也是最難分析的數據。醫療機構如何使用現代數據分析工具和技術來分析這些複雜數據並從這些數據中創造出價值?
  • Jetpack 實戰:神奇寶貝
    ,為了文章的簡潔性,本文不會細究技術細節,因為每個技術都需要花好幾篇文章才能分析清楚,我會在後續的文章去詳細分析。只需要三步1.將 PokemonGo 項目根目錄 checkVersions.gradle 文件拷貝到你的項目根目錄下面2.在項目的根目錄 build.gradle 文件夾內添加以下代碼apply from: '.
  • Python 實戰:股票數據定向爬蟲
    右邊為該網頁的原始碼,在原始碼中查詢13.06發現沒有找到。所以判斷該網頁的數據使用js生成的,不適合本項目。因此換一個網頁。再打開百度股票的網址:連結描述(https://gupiao.baidu.com/stock/sz300023.html),如下圖所示:
  • 小衛星,大數量:挖掘地球的「數據金礦」
    大量小衛星上天帶動的「第四次太空革命」正在將地球轉變為一個龐大的數據集,客戶已經能從雲端獲取每日更新的、覆蓋整個地球表面的圖像。
  • 數據分析案例:預測乳腺癌是否復發
    ,其中34位5年內病情復發,另外44位5年內未見復發,現需要對19位經過治療的病人,分析其在5年內是否會復發,並評估模型的準確性及可行性。數據說明       訓練數據包含78位乳腺癌病人樣本,他們中的34位5年內病情復發(標記為relapse),另外的44位至少在5年內未復發(標記為non-relapse)。相應地,這裡有12位復發,7位未復發的病人樣本在測試集中。使用到的基因數量為24481。
  • 數據挖掘之道:不經意間你所熟悉的答案,已經成了笑話
    如果一個技術猿失去了開放的大腦,很容易就從他的身上嗅出大叔的味道,因為他已經老了,更嚴重的是在職業發展的道路上要不被技術淘汰,要不轉做管理人員。是的,一夜之間你以前所熟悉的答案,已經成了現在的笑話了。下面是前50的高票問題,及其與data.table的關係。對一些高票答案進行對比一下,就可以看出data.table的優勢。
  • 福利大放送:空間統計&插值&大數據PPT
    想第一次聽見這個卓有創意的廣告,還是幾年前青春年少的蝦神在國圖門口,聽見賣皮包用高音喇叭播放的,為此還專門駐足聽了完整版……好吧,這個不重要,重要的消息在下面,嗯說之前,請先讓我來一杯82年的「lafei」穩定一下心情:這個重要的消息就是蝦神準備福利大放送,首次發布空間統計&插值分析&Esri眼中的大數據以及GIS與空間思維四個強大的PPT……
  • 數據治理 | 處理數據:兩位經驗研究者的經驗
    我們為絕大多數的數據處理編寫代碼,並將這些代碼文件保存在Scripts文件夾中,而不是在excel文件中修改數據或在Stata中運行命令而不保存在Script中,這樣做有兩個好處:不僅記錄了你所做的事情,最重要的是,你、你的合作者或其他人,可以複製和檢查你所做的事情。
  • 大數據2015:Hadoop和大數據-60款頂級大數據開源工具
    NLPIR NLPIR大數據搜索挖掘平臺,是一種開源的大數據搜索挖掘、分析和可視化平臺。你只要在http://ictclas.nlpir.org/nlpir/試一下演示版,就能看到他的實際效果。PandasPandas項目包括基於Python程式語言的數據結構和數據分析工具。它讓企業組織可以將Python用作R之外的一種選擇,用於大數據分析項目。支持的作業系統:Windows、Linux和OS X。
  • Python 網絡爬蟲實戰:爬取並下載《電影天堂》3千多部動作片電影
    然後,通過一些手段(比如說json庫,BeautifulSoup庫,正則表達式等)從網頁原始碼中篩選出我們想要的數據(當然,前提是我們需要分析網頁結構,知道自己想要什麼數據,以及這些數據存放在網頁的哪兒,存放的位置有什麼特徵等)。最後,將我們獲取到的數據按照一定的格式,存儲到本地或者資料庫中,這樣就完成了爬蟲的全部工作。
  • Excel數據分析必備技能:對數據按範圍多條件劃分等級的判定套路
    免費關注置頂公眾號或設為星標,否則可能收不到文章個人微信號 | (ID:LiRuiExcel520)微信服務號 | 跟李銳學Excel(ID:LiRuiExcel)微信公眾號 | Excel函數與公式(ID:ExcelLiRui)職場辦公中經常要對數據進行整理和分析
  • 【周末薦書】決戰大數據:駕馭未來商業的利器
    10月25日推薦書為:《決戰大數據:駕馭未來商業的利器》作者作為一名經驗豐富的電商人,在敬畏大數據的同時,洞悉到了數據時代商業發展的更多契機,他創新了數據框架的建立和使用,重新量化了數據價值的指標,並挖掘了在無線數據和多屏時代下商業發展的本質
  • Linux項目實戰系列之:再談一次GPS數據解析
    第一個要分享的是,來源於一位微信公眾號網友的留言,在上一篇文章裡,我採用的是用strtok函數進行欄位分割,該網友建議試試sscanf,sscanf函數不知道大家平時有沒有用過,它用來分割並處理一串數據比較方便。
  • Excel數據分析工具:直方圖
    直方圖的意義及作用,在上面的歷史文章中已經介紹過,直方圖是一種特殊的柱形圖,X軸是分組,Y軸是頻數,主要是用來比較數據的分布狀況。Excel數據分析工具中的直方圖模塊,除了可以直接用直方圖對數據做出分析外,還有柏拉圖的內容。柏拉圖在有些地方又稱為帕累託圖(Pareto chart)、排列圖或主次圖,在問題分析和解決過程中經常會被使用, 特別是製造業生產的質量控制。
  • 數據挖掘:安度因即將加入風暴英雄
    在《風暴英雄》最新測試服客戶端中,有玩家通過數據挖掘發現了以下新禮包配圖:
  • 深度好文:十個段子反思大數據
    數據那麼大,價值密度那麼低,你也可以去分析,但從何分析起?首先想到的方法和工具,難道不是當下你最熟悉的?而你最熟悉的,就能確保它就是最好的嗎?人們總是期望,能從大數據中挖掘出意想不到的「大價值」。可李國傑院士認為【8】,實際上,大數據的價值,主要體現在它的驅動效應上,大數據對經濟的貢獻,並不完全反映在大數據公司的直接收入上,應考慮對其他行業效率和質量提高的貢獻。
  • 寫給所有的DC小夥伴及數據極客們
    2016年,DataCastle共舉辦大小小的數據類競賽十餘場,我們的官網註冊會員數,已突破三萬大關。剛剛過去的11月,我們榮獲了大數據產業應用創新黑馬企業獎,DC也漸漸發展成了一個人才濟濟的大家庭,誠摯感謝大家對DC一如既往的喜愛和支持。