美文网首页数据产品
航空公司客户价值分析

航空公司客户价值分析

作者: 陈一鸣 | 来源:发表于2020-05-23 15:09 被阅读0次

    客户关系管理是精准化运营的基础,而客户关系管理的核心是客户分类。通过客户分类,对客户群体进行细分,区别出低价值客户与高价值客户,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,从而实现效益最大化。
    总体流程:

    1、抽取航空公司2012年4月1日至2014年3月31日的数据。
    2、对抽取的数据进行数据探索分析与预处理,包括数据缺失值与异常值的探索分析、数据清洗、特征构建、标准化等操作。
    3、基于RFM模型,使用K-Means算法进行客户分群。
    4、针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务。

    一、导入相关的库,加载数据

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    import warnings
    warnings.filterwarnings('ignore')
    plt.style.use('ggplot')
    %matplotlib inline
    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    
    air_data = pd.read_csv('C:/Users/Jason/Desktop/air_data.csv',encoding='utf8')
    
    查看数据结构,6W+的数据,44个字段,包含了客户的基本信息,客户乘机信息,和客户的积分信息。 info.png
    air_data.head()
    -->>
      MEMBER_NO   FFP_DATE  FIRST_FLIGHT_DATE   GENDER  FFP_TIER    WORK_CITY   WORK_PROVINCE   WORK_COUNTRY    AGE LOAD_TIME   ... ADD_Point_SUM   Eli_Add_Point_Sum   L1Y_ELi_Add_Points  Points_Sum  L1Y_Points_Sum  Ration_L1Y_Flight_Count Ration_P1Y_Flight_Count Ration_P1Y_BPS  Ration_L1Y_BPS  Point_NotFlight
    0   54993   2006/11/2   2008/12/24  男   6   .   北京  CN  31.0    2014/3/31   ... 39992   114452  111100  619760  370211  0.509524    0.490476    0.487221    0.512777    50
    1   28065   2007/2/19   2007/8/3    男   6   NaN 北京  CN  42.0    2014/3/31   ... 12000   53288   53288   415768  238410  0.514286    0.485714    0.489289    0.510708    33
    2   55106   2007/2/1    2007/8/30   男   6   .   北京  CN  40.0    2014/3/31   ... 15491   55202   51711   406361  233798  0.518519    0.481481    0.481467    0.518530    26
    3   21189   2008/8/22   2008/8/23   男   5   Los Angeles CA  US  64.0    2014/3/31   ... 0   34890   34890   372204  186100  0.434783    0.565217    0.551722    0.448275    12
    4   39546   2009/4/10   2009/4/15   男   6   贵阳  贵州  CN  48.0    2014/3/31   ... 22704   64969   64969   338813  210365  0.532895    0.467105    0.469054    0.530943    39
    5 rows × 44 columns
    
    air_data.info()
    -->>
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 62988 entries, 0 to 62987
    Data columns (total 44 columns):
    MEMBER_NO                  62988 non-null int64
    FFP_DATE                   62988 non-null object
    FIRST_FLIGHT_DATE          62988 non-null object
    GENDER                     62985 non-null object
    FFP_TIER                   62988 non-null int64
    WORK_CITY                  60719 non-null object
    WORK_PROVINCE              59740 non-null object
    WORK_COUNTRY               62962 non-null object
    AGE                        62568 non-null float64
    LOAD_TIME                  62988 non-null object
    FLIGHT_COUNT               62988 non-null int64
    BP_SUM                     62988 non-null int64
    EP_SUM_YR_1                62988 non-null int64
    EP_SUM_YR_2                62988 non-null int64
    SUM_YR_1                   62437 non-null float64
    SUM_YR_2                   62850 non-null float64
    SEG_KM_SUM                 62988 non-null int64
    WEIGHTED_SEG_KM            62988 non-null float64
    LAST_FLIGHT_DATE           62988 non-null object
    AVG_FLIGHT_COUNT           62988 non-null float64
    AVG_BP_SUM                 62988 non-null float64
    BEGIN_TO_FIRST             62988 non-null int64
    LAST_TO_END                62988 non-null int64
    AVG_INTERVAL               62988 non-null float64
    MAX_INTERVAL               62988 non-null int64
    ADD_POINTS_SUM_YR_1        62988 non-null int64
    ADD_POINTS_SUM_YR_2        62988 non-null int64
    EXCHANGE_COUNT             62988 non-null int64
    avg_discount               62988 non-null float64
    P1Y_Flight_Count           62988 non-null int64
    L1Y_Flight_Count           62988 non-null int64
    P1Y_BP_SUM                 62988 non-null int64
    L1Y_BP_SUM                 62988 non-null int64
    EP_SUM                     62988 non-null int64
    ADD_Point_SUM              62988 non-null int64
    Eli_Add_Point_Sum          62988 non-null int64
    L1Y_ELi_Add_Points         62988 non-null int64
    Points_Sum                 62988 non-null int64
    L1Y_Points_Sum             62988 non-null int64
    Ration_L1Y_Flight_Count    62988 non-null float64
    Ration_P1Y_Flight_Count    62988 non-null float64
    Ration_P1Y_BPS             62988 non-null float64
    Ration_L1Y_BPS             62988 non-null float64
    Point_NotFlight            62988 non-null int64
    dtypes: float64(12), int64(24), object(8)
    memory usage: 21.1+ MB
    
    2.1 客户基本信息分布分析

    选取客户基本信息中的入会时间、性别、会员卡级别和年龄字段进行探索分析,探索客户的基本信息分布情况

    #处理入会时间,拿到年份,并按时间排序
    air_data['year'] = pd.to_datetime(air_data['FFP_DATE']).dt.year
    air_data = air_data.sort_values(by=['year'],ascending=True)
    air_data = air_data.reset_index(drop=True)
    
    sns.countplot('year',data=air_data)
    plt.title('每年入会人数',fontsize=14)
    
    image.png

    绘制会员性别比例饼图

    air_data['GENDER'].value_counts().plot.pie(shadow=True,autopct='%.2f%%',labels=['男','女'])
    
    image.png

    绘制会员各级别人数条形图

    air_data.FFP_TIER.value_counts().plot.bar(label='grade',color='dodgerblue')
    plt.title('会员各级别人数', fontsize=20)
    plt.xlabel('会员等级', fontsize=14)
    plt.ylabel('人数', fontsize=14)
    
    image.png

    绘制年龄分布图

    age = air_data['AGE'].dropna()
    age = age.astype('int64')
    fig = plt.figure(figsize = (5 ,10))
    plt.boxplot(age, 
                labels = ['AGE'],
                patch_artist=True,
                boxprops = {'facecolor':'lightblue'})
    plt.title('age')
    
    image.png

    可以看出大部分会员年龄集中在30~50岁之间,极少量的会员年龄小于20岁或高于60岁,且存在一个超过100岁的异常数据

    2.2 客户乘机信息分布分析
    lte = air_data['LAST_TO_END']
    plt.figure(figsize = (5,8))
    plt.boxplot(lte,
                patch_artist=True,
                labels = ['Time'],
                boxprops = {'facecolor':'lightblue'})
    plt.title('乘机时长分布箱线图')
    
    image.png

    绘制客户飞行次数箱线图

    fc = air_data['FLIGHT_COUNT']
    plt.figure(figsize = (5 ,8))
    plt.boxplot(fc, 
                patch_artist=True,
                labels = ['FLIGHT_COUNT'],
                boxprops = {'facecolor':'lightblue'})
    plt.title('飞行次数箱线图')
    
    image.png

    绘制客户总飞行公里数箱线图


    image.png

    客户的飞行次数与总飞行公里数也明显地分为两个群体,大部分客户集中在箱型图下方的箱体中,少数客户分散分布在箱体上界的上方,这部分客户很可能是高价值客户,因为其飞行次数和总飞行公里数明显超过箱体内的其他客户

    2.3 客户积分信息分布分析
    ec = air_data['EXCHANGE_COUNT']
    
    fig = plt.figure(figsize = (8 ,5))
    plt.hist(ec, bins=5, color='lightblue')
    plt.xlabel('兑换次数')
    plt.ylabel('会员人数')
    plt.title('会员兑换积分次数分布直方图')
    
    image.png

    绘制会员兑换积分次数直方图,绝大部分客户的兑换次数在0~10的区间内,这表示大部分客户都很少进行积分兑换
    绘制会员总累计积分箱线图

    ps = air_data['Points_Sum']
    
    fig = plt.figure(figsize = (5 ,8))
    plt.boxplot(ps, 
                patch_artist=True,
                labels = ['总累计积分'],  # 设置x轴标题
                boxprops = {'facecolor':'lightblue'})  # 设置填充颜色
    plt.title('客户总累计积分箱线图')
    
    image.png

    一部分客户集中在箱体中,少部分客户分散分布在箱体上方,这部分客户的积分要明显高于箱体内的客户的积分。

    三、相关性分析

    air_data['AGE'].fillna(0,inplace=True)
    air_data['AGE'].astype('int64')
    
    data_2 = air_data[['FFP_TIER','FLIGHT_COUNT','LAST_TO_END',
                      'SEG_KM_SUM','EXCHANGE_COUNT','Points_Sum','AGE']]
    
    data_corr = data_2.corr(method = 'pearson')
    print('相关性矩阵为:\n',data_corr)
    -->>
    相关性矩阵为:
                     FFP_TIER  FLIGHT_COUNT  LAST_TO_END  SEG_KM_SUM  \
    FFP_TIER        1.000000      0.582447    -0.206313    0.522350   
    FLIGHT_COUNT    0.582447      1.000000    -0.404999    0.850411   
    LAST_TO_END    -0.206313     -0.404999     1.000000   -0.369509   
    SEG_KM_SUM      0.522350      0.850411    -0.369509    1.000000   
    EXCHANGE_COUNT  0.342355      0.502501    -0.169717    0.507819   
    Points_Sum      0.559249      0.747092    -0.292027    0.853014   
    AGE             0.076245      0.075309    -0.027654    0.087285   
    
                    EXCHANGE_COUNT  Points_Sum       AGE  
    FFP_TIER              0.342355    0.559249  0.076245  
    FLIGHT_COUNT          0.502501    0.747092  0.075309  
    LAST_TO_END          -0.169717   -0.292027 -0.027654  
    SEG_KM_SUM            0.507819    0.853014  0.087285  
    EXCHANGE_COUNT        1.000000    0.578581  0.032760  
    Points_Sum            0.578581    1.000000  0.074887  
    AGE                   0.032760    0.074887  1.000000 
    
    plt.subplots(figsize=(10, 10))
    sns.heatmap(data_corr, annot=True, vmax=1, square=True, cmap='Blues')
    
    image.png

    可以看出部分属性间具有较强的相关性,如FLIGHT_COUNT(飞行次数)属性与SEG_KM_SUM(飞行总公里数)属性;也有部分属性与其他属性的相关性都较弱,如AGE(年龄)属性与EXCHANGE_COUNT(积分兑换次数)属性

    四、数据预处理

    1、丢弃票价为空的记录
    2、保留票价不为0的,或者平均折扣率不为0且总飞行公里数大于0的记录
    3、丢弃年龄大于90的记录

    air_data = air_data.dropna(axis=0,subset=['SUM_YR_1','SUM_YR_2'])
    
    air_data = air_data[((air_data['SUM_YR_1']>0) | 
               (air_data['SUM_YR_2']>0)) & 
               (air_data['SEG_KM_SUM']>0) & 
               (air_data['avg_discount']>0) &
               (air_data['AGE']<90)]
    

    航空公司客户价值分析的LRFMC模型

    在RFM模型中,消费金额表示在一段时间内客户购买该企业产品的金额的总和。由于航空票价受到运输距离、舱位等级等多种因素的影响,同样消费金额的不同旅客对航空公司的价值是不同的,例如,一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对于航空公司而言更有价值。因此这个特征并不适用于航空公司的客户价值分析。本案例选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。
    将清洗好的数据,保存,并重新读进来

    air_data.to_csv('C:/Users/Jason/Desktop/cleandata.csv')
    
    clean_data = pd.read_csv('C:/Users/Jason/Desktop/cleandata.csv',encoding='utf8')
    airline_selection = clean_data[['FFP_DATE','LOAD_TIME','LAST_TO_END',
                                         'FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
    airline_selection.head()
    -->>
        FFP_DATE    LOAD_TIME   LAST_TO_END FLIGHT_COUNT    SEG_KM_SUM  avg_discount
    0   2004/11/10  2014/3/31   532                4            6676    0.618507
    1   2004/12/16  2014/3/31   74                 26           22501   0.664746
    2   2004/12/12  2014/3/31   51                 12           14229   0.659940
    3   2004/11/16  2014/3/31   18                 34           63138   0.703389
    4   2004/12/4   2014/3/31   120                8            9472    0.789173
    

    3 数据变换

    将数据转换成“适当的”格式,以适应挖掘任务及算法的需要。

    1、会员入会时间距观测窗口结束的月数L=会员入会时长
    2、客户最近一次乘坐公司飞机距观测窗口结束的月数R=最后一次乘机时间至观测窗口末端时长(单位:月)
    3、客户在观测时间内在公司累计的飞行次数F=观测窗口内的飞行次数
    4、客户在观测时间内在公司累计的飞行里程M=观测窗口总飞行公里数(单位:公里 )
    5、客户在观测时间内乘坐舱位所对应的折扣系数的平均值C=平均折扣率(单位:无)

    在完成5个指标的数据提取后,发现5个指标的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据进行标准化处理。

    L = pd.to_datetime(airline_selection['LOAD_TIME']) - pd.to_datetime(airline_selection['FFP_DATE'])
    L = L.astype('str').str.split().str[0]
    L = L.astype('int')/30
    
    airline_features = pd.concat([L,airline_selection.iloc[:,2:]],axis = 1)
    airline_features.columns = ['L','R','F','M','C']
    print('构建的LRFMC属性前5行为:\n',airline_features.head())
    
    from sklearn.preprocessing import StandardScaler
    data = StandardScaler().fit_transform(airline_features)
    #np.savez('./airline_scale.npz',data)
    print('标准化后LRFMC五个属性为:\n',data[:5,:])
    -->>
    构建的LRFMC属性前5行为:
                 L    R   F      M         C
    0  114.266667  532   4   6676  0.618507
    1  113.066667   74  26  22501  0.664746
    2  113.200000   51  12  14229  0.659940
    3  114.066667   18  34  63138  0.703389
    4  113.466667  120   8   9472  0.789173
    标准化后LRFMC五个属性为:
     [[ 2.28756662e+00  1.98039007e+00 -5.64949606e-01 -5.05698640e-01
      -5.60915156e-01]
     [ 2.24510402e+00 -5.42748029e-01  9.94140237e-01  2.45976439e-01
      -3.10753686e-01]
     [ 2.24982209e+00 -6.69455837e-01  1.99215512e-03 -1.46937069e-01
      -3.36755079e-01]
     [ 2.28048952e+00 -8.51253997e-01  1.56108200e+00  2.17620204e+00
      -1.01684203e-01]
     [ 2.25925822e+00 -2.89332412e-01 -2.81478725e-01 -3.72890835e-01
       3.62423806e-01]]
    

    五、K-means客户聚类分析

    import sklearn.cluster as sc
    
    model = sc.KMeans(n_clusters=5,n_jobs=4,random_state=123)
    model.fit(data)
    print('聚类中心:\n',model.cluster_centers_)
    print('样本类别标签:\n',model.labels_)
    print('不同类别样本的数目:\n',pd.Series(model.labels_).value_counts())
    -->>
    聚类中心:
     [[ 4.44122029e-02 -1.25713163e-03 -2.31529890e-01 -2.35603446e-01
       2.17621203e+00]
     [-7.00306446e-01 -4.14995805e-01 -1.60820472e-01 -1.60541288e-01
      -2.57088898e-01]
     [ 4.83525873e-01 -7.99379485e-01  2.48301289e+00  2.42404346e+00
       3.09458304e-01]
     [-3.13149703e-01  1.68702109e+00 -5.73893678e-01 -5.36736856e-01
      -1.75279754e-01]
     [ 1.16080943e+00 -3.77571898e-01 -8.66555767e-02 -9.45788420e-02
      -1.56541623e-01]]
    样本类别标签:
     [3 4 4 ... 1 1 1]
    不同类别样本的数目:
     1    24630
    4    15733
    3    12115
    2     5337
    0     4225
    dtype: int64
    
    cluster_center = pd.DataFrame(model.cluster_centers_,\
                 columns = ['ZL','ZR','ZF','ZM','ZC'])
    cluster_center.index = pd.DataFrame(model.labels_ ).\
                      drop_duplicates().iloc[:,0]
    print(cluster_center)
    -->>
             ZL        ZR        ZF        ZM        ZC
    0                                                  
    3  0.044412 -0.001257 -0.231530 -0.235603  2.176212
    4 -0.700306 -0.414996 -0.160820 -0.160541 -0.257089
    2  0.483526 -0.799379  2.483013  2.424043  0.309458
    0 -0.313150  1.687021 -0.573894 -0.536737 -0.175280
    1  1.160809 -0.377572 -0.086656 -0.094579 -0.156542
    

    绘制客户关系雷达图

    labels = ['ZL','ZR','ZF','ZM','ZC']
    legen = [' customers' + str(i + 1) for i in cluster_center.index]
    lstype = ['-','--',(0, (3, 5, 1, 5, 1, 5)),':','-.']
    kinds = list(cluster_center.iloc[:, 0])
    并转换为 np.ndarray
    cluster_center = pd.concat([cluster_center, cluster_center[['ZL']]], axis=1)
    centers = np.array(cluster_center.iloc[:, 0:])
    
    n = len(labels)
    angle = np.linspace(0, 2 * np.pi, n, endpoint=False)
    angle = np.concatenate((angle, [angle[0]]))
    
    fig = plt.figure(figsize = (8,6))
    ax = fig.add_subplot(111, polar=True) 
    
    for i in range(len(kinds)):
        ax.plot(angle, centers[i], linestyle=lstype[i], linewidth=2, label=kinds[i])
    ax.set_thetagrids(angle * 180 / np.pi, labels)
    plt.title('Customer Profile Analysis')
    plt.legend(legen)
    
    image.png

    通过建立合理的客户价值评估模型,对客户进行分类,分析比较不同客户群体的价值,并制定相应的营销策略,对不同的客户群提供个性化的客户服务是必须的和有效的。

    相关文章

      网友评论

        本文标题:航空公司客户价值分析

        本文链接:https://www.haomeiwen.com/subject/usokahtx.html