日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用K-Means聚类进行航空公司客户价值分析

發布時間:2024/1/18 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用K-Means聚类进行航空公司客户价值分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.背景與挖掘目標

1.1背景

  • 航空公司業務競爭激烈,從產品中心轉化為客戶中心。

  • 針對不同類型客戶,進行精準營銷,實現利潤最大化。

  • 建立客戶價值評估模型,進行客戶分類,是解決問題的辦法

  • 1.2挖掘目標

  • 借助航空公司客戶數據,對客戶進行分類。

  • 對不同的客戶類別進行特征分析,比較不同類客戶的客戶價值

  • 對不同價值的客戶類別提供個性化服務,制定相應的營銷策略。

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

    2.分析方法與過程

    2.1分析方法

  • 首先,明確目標是客戶價值識別。

  • 識別客戶價值,應用最廣泛的模型是三個指標(消費時間間隔(Recency),消費頻率(Frequency),消費金額(Monetary))

  • 以上指標簡稱RFM模型,作用是識別高價值的客戶

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

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

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

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

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

    • 如果采用傳統的RFM模型,如下圖。它是依據,各個屬性的平均值進行劃分,但是,細分的客戶群太多,精準營銷的成本太高。

    • 綜上,這次案例,采用聚類的辦法進行識別客戶價值,以LRFMC模型為基礎

    • 本案例,總體流程如下圖

    • 2.2挖掘步驟

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

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

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

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

    • 2.3數據抽取

    • 選取,2014-03-31為結束時間,選取寬度為兩年的時間段,作為觀測窗口,抽取觀測窗口內所有客戶的詳細數據,形成歷史數據

    • 對于后續新增的客戶信息,采用目前的時間作為重點,形成新增數據

    • 2.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
      ...

      2.3數據預處理

    • 數據清洗

      • 丟棄票價為空記錄

      • 丟棄票價為0、平均折扣率不為0、總飛行公里數大于0的記錄

      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 ?

      屬性規約

    • 原始數據中屬性太多,根據航空公司客戶價值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

      數據變換

    • 意思是,將原始數據轉換成“適當”的格式,用來適應算法和分析等等的需要。

    • 本案例,主要采用數據變換的方式為屬性構造和數據標準化 3.需要構造LRFMC的五個指標

      • 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,從圖中可以看到:
      1、客戶群4[blue] 的F,M很高,L也不低,可以看做是重要保持的客戶;
      2、客戶群3[yellow] 重要發展客戶
      3、客戶群1[red] 重要挽留客戶,原因:入會時間長,但是F,M較低
      4、客戶群2[green] 一般客戶
      5、客戶群5[black] 低價值客戶

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

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

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

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

      3.模型應用

    • 會員的升級與保級(積分兌換原理相同)
      會員可以分為,鉆石,白金,金卡,銀卡…
      部分客戶會因為不了解自身積分情況,錯失升級機會,客戶和航空公司都會有損失
      在會員接近升級前,對高價值客戶進行促銷活動,刺激他們消費達到標準,雙方獲利

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

    • 管理模式
      企業要獲得長期的豐厚利潤,必須需要大量穩定的、高質量的客戶。
      維持老客戶的成本遠遠低于新客戶,保持優質客戶是十分重要的。
      精準營銷中,也有成本因素,所以按照客戶價值排名,進行優先的,特別的營銷策略,是維持客戶的關鍵。

    • 4.小結

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

      贊賞作者


      本文作者

      ?

      無小意,Python中文社區專欄作者,知乎:無小意丶,金融學在讀學生,從零開始自學Python以及相關的數據技能,對于Python學習,只想說別猶豫。

      blog:http://blog.csdn.net/weixin_39722361

      ?

      在編程狗公眾號底部回復0204

      獲取本文完整源碼下載地址

      點擊閱讀原文,加入CodingGo編程社區

    總結

    以上是生活随笔為你收集整理的利用K-Means聚类进行航空公司客户价值分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。