利用KMeans聚類進行航空公司客戶價值分析


    准確的客戶分類的結果是企業優化營銷資源的重要依據,本文利用了航空公司的部分數據,利用Kmeans聚類方法,對航空公司的客戶進行了分類,來識別出不同的客戶群體,從來發現有用的客戶,從而對不同價值的客戶類別提供個性化服務,指定相應的營銷策略。

一、分析方法和過程

1.數據抽取——>2.數據探索與預處理——>3。建模與應用

    傳統的識別客戶價值應用最廣泛的模型主要通過3個指標(最近消費時間間隔(Recency)、消費頻率(Frequency)和消費金額(Monetary))來進行客戶細分,識別出價值高的客戶,簡稱RFC模型。點擊查看RFC

    在RFC模型中,消費金額表示在一段時間內,客戶購買產品的總金額。但是不適用於航空公司的數據處理。因此我們用客戶在一段時間內的累計飛行里程M和客戶在一定時間內乘坐艙位的折扣系數C代表消費金額。再在模型中增加客戶關系長度L,所以我們用LRFMC模型。

因此本次數據挖掘的主要步驟:

1).從航空公司的數據源中進行選擇性抽取與新增數據抽取分別形成歷史數據和增量數據

2).對步驟1)中形成的兩個數據集進行數據探索分析和預處理,包括數據缺失值和異常值分析。即數據屬性的規約、清洗和變換

3).利用步驟2)中的處理的數據進行建模,利用Python下Sklearn庫中提供的KMeans方法,進行聚類

4)。針對模型的結果進行分析。

二。數據處理

1.下面是本次試驗數據集的一部分截圖,數據集抽取2012-4-1到2014-3-31內乘客的數據,一個62988條數據。包括了會員卡號、入會時間、性別、年齡等44個屬性。

2.數據探索分析:主要是對數據進行缺失值分析與異常值的分析。通過發現原始數據中存在票價為空值,票價最小值為0,折扣率最小值為0、總飛行公里數大於0的記錄。

其Python代碼如下:

def explore(datafile,exploreoutfile):
    """
    進行數據的探索
    @Dylan
    :param data: 原始數據目錄
    :return: 探索后的結果
    """
    data=pd.read_csv(datafile,encoding='utf-8')
    explore=data.describe(percentiles=[],include='all').T####包含了對數據的基本描述,percentiles參數是指定計算多少分位數
    explore['null']=len(data)-explore['count'] ##手動計算空值數
    explore=explore[['null','max','min']]####選取其中的重要列
    explore.columns=['空值數','最大值','最小值']
    """describe()函數自動計算的字段包括:count、unique、top、max、min、std、mean。。。。。
    """
    # explore=explore.fillna(0)
    explore.to_excel(exploreoutfile)

 上面代碼得到的探索結果:

3.數據預處理:

3.1數據清洗:

(1)丟棄票價為空的記錄

(2)丟棄票價為0、平均折扣率不足0、總飛行公里數大於0的距離

數據清洗的Python代碼如下:

def clean_data(datafile,cleanoutfile):
    """
    進行數據清洗,丟棄票價為空記錄,丟棄票價為0,折扣不為0且飛行距離大於0的距離
    @Dylan
    :param data:原始數據
    :return:
    """
    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
    index2=data['SUM_YR_2']!=0
    index3=(data['SEG_KM_SUM']==0) & (data['avg_discount']==0)

    data=data[index1 | index2 | index3]
    data.to_excel(cleanoutfile)

 3.2屬性規約

選擇與LRFMC模型指標相關的6個屬性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、avg_discount、SEG_KM_SUM、LAST_TO_END。刪除不相關的屬性。

3.3 數據變換

由於原始數據沒有直接給出LRFMC五個指標,需要自己計算,具體的計算方式為:

(1)L=LOAD_TIME-FFP_DATE

(2)R=LAST_TO_END

(3)F=FLIGHT_COUNT

 (4) M=SEG_KM_SUM

(5)C=avg_discount

數據變換的Python代碼如下:

def reduction_data(datafile,reoutfile):
    data=pd.read_excel(cleanoutfile,encoding='utf-8')
    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)
    ####這四行代碼費了我3個小時
    d_ffp=pd.to_datetime(data['FFP_DATE'])
    d_load=pd.to_datetime(data['LOAD_TIME'])
    res=d_load-d_ffp
    data['L']=res.map(lambda x:x/np.timedelta64(30*24*60,'m'))

    data['R']=data['LAST_TO_END']
    data['F']=data['FLIGHT_COUNT']
    data['M']=data['SEG_KM_SUM']
    data['C']=data['avg_discount']
    data=data[['L','R','F','M','C']]
    data.to_excel(reoutfile)

變換結果如下:

 3.4 數據標准化

Python代碼如下:

def zscore_data(datafile,zscorefile):
    data=pd.read_excel(datafile)
    data=(data-data.mean(axis=0))/data.std(axis=0)
    data.columns=['Z'+i for i in data.columns]

    data.to_excel(zscorefile,index=False)

 最后數據結果如下:

 

4.建立模型

4.1客戶聚類

采用kMeans聚類算法對客戶數據進行客戶分組,聚成5組,Python代碼如下:

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from itertools import cycle

datafile='./tmp/zscore.xls'
k=5
classoutfile='./tmp/class.xls'
resoutfile='./tmp/result.xls'
data=pd.read_excel(datafile)

kmodel=KMeans(n_clusters=k,max_iter=1000)
kmodel.fit(data)

# print(kmodel.cluster_centers_)
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)+['聚類類別']
# r.to_excel(resoutfile,index=False)

 對數據進行聚類分群的結果如下表所示:

自定義繪圖函數進行繪制出每個聚類數據的密度圖像:

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(k)]
    [p[i].set_title('客戶群%d' %i) for i in range(k)]
    plt.legend()
    return plt

下圖為其中的一個

 

有了模型和圖像后我們就可以進行分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM