精华内容
下载资源
问答
  • 2022-04-21 22:46:24

    前言

    客户关系管理是企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业针对不同价值的客户制订优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。

    一、相关知识点

    1.RFM模型:
    RFM模型是识别客户价值应用最广泛的模型.
    (1) R
    R(Recency)指的是最近一次消费时间与械止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,客户对即时提供的商品或是服务也最有可能感兴趣。这也是为什么消费时间间隔为 0~6个月的顾客收到的沟通信息多于一年以上的顾客。最近一次消费时间与截止时间的间隔不仅能够为确定促销客户群体提供依据,还能够从中得出企业发展的趋势。如果分析报告显示距离最近一次消费时间很近的客户在增加,则表示该公司是个稳步 上升的公司。反之,距离最近一次消费时问很近的客户越来越少,则说明该公司需要找到问题所在,及时调整营销策略。
    (2) F
    F(Frequency)指顾客在某段时问内所消费的次数。消费频率越高的顾客,也是满意度越高的顾客,其忠诚度越高,顾客价值也就越大。增加顾客购买的次数意味着从竞争对手处抢得市场占有率,赚取营业额。商家需要做的,是通过各种营销方式去不断地刺激顾客消费,提高他们的消费频率,提升店铺的复购率。
    (3) M
    M(Monetarv)指顾客在某段时问内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓 “20%的顾客贡献了 80%的销售额” 的二八法则。而这批顾客也必然是商家在进行营销活动时蛋要特别照顾的群体,尤其是在商家前期资源不足的时候。不过需要注意一点,不论采用哪种营销方式,以不对顾客造成骚扰为大前提,否则营销只会产生负面效果。

    在RFM 模型理论中,最近一次消费时间与截止时间的间隔、消费频率、消费金额是测算容户价值最重要的特征。这了个特征对营销活动具有十分重要的意义。其中,最近次消费时间与截止时间的间隔是最有力的特征。

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

    将客户关系长度L、消费时间间隔R、消费频率F、飞行里程 M 和折扣系数的乎均值C这5个特征作为航空公司识别客户价值的特征。记为 LRFMC 模型。

    二、完整代码

    ##1.预处理航空客户数据
    import numpy as np
    import pandas as pd
    airline_data = pd.read_csv("./data/air_data.csv",
        encoding="gb18030") #导入航空数据
    print('原始数据的形状为:',airline_data.shape)
    ## 去除票价为空的记录
    exp1 = airline_data["SUM_YR_1"].notnull()
    exp2 = airline_data["SUM_YR_2"].notnull()
    exp = exp1 & exp2
    airline_notnull = airline_data.loc[exp,:]
    print('删除缺失记录后数据的形状为:',airline_notnull.shape)
    #只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
    index1 = airline_notnull['SUM_YR_1'] != 0
    index2 = airline_notnull['SUM_YR_2'] != 0
    index3 = (airline_notnull['SEG_KM_SUM']> 0) & \
        (airline_notnull['avg_discount'] != 0)  
    airline = airline_notnull[(index1 | index2) & index3]
    print('删除异常记录后数据的形状为:',airline.shape)
    
    ##2.选取需求特征
    airline_selection = airline[["FFP_DATE","LOAD_TIME",
        "FLIGHT_COUNT","LAST_TO_END",
        "avg_discount","SEG_KM_SUM"]]
    ## 构建L特征
    L = pd.to_datetime(airline_selection["LOAD_TIME"]) - pd.to_datetime(airline_selection["FFP_DATE"]) #计算结果为:数字+空格+days的形式
    L = L.astype("str").str.split().str[0] #要想取出其中的数字可进行操作:先将类型转换为str,然后在进行分割,最后才进行取数
    L = L.astype("int")/30
    ## 合并特征
    airline_features = pd.concat([L,
        airline_selection.iloc[:,2:]],axis = 1) #行合并
    print('构建的LRFMC特征前5行为:\n',airline_features.head())
    #标准化
    from sklearn.preprocessing import StandardScaler
    data = StandardScaler().fit_transform(airline_features)
    np.savez('./tmp/airline_scale.npz',data)
    print('标准化后LRFMC五个特征为:\n',data[:5,:])
    
    ##3.使用K-Means算法进行客户分群
    import numpy as np
    import pandas as pd
    from sklearn.cluster import KMeans #导入kmeans算法
    airline_scale = np.load('./tmp/airline_scale.npz')['arr_0']
    k = 5 ## 确定聚类中心数
    #构建模型
    kmeans_model = KMeans(n_clusters = k,n_jobs=4,random_state=123)
    fit_kmeans = kmeans_model.fit(airline_scale)   #模型训练
    c1=kmeans_model.cluster_centers_ #查看聚类中心
    print('查看聚类中心:\n',c1)
    l1=kmeans_model.labels_ #查看样本的类别标签
    print('查看样本的类别标签:\n',l1)
    #统计不同类别样本的数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    print('最终每个类别的数目为:\n',r1)
    # 输出聚类分群的结果
    cluster_center = pd.DataFrame(c1,columns = ['ZL','ZR','ZF','ZM','ZC'])   # 将聚类中心放在数据框中
    cluster_center.index = pd.DataFrame(l1).drop_duplicates().iloc[:,0]  # 将样本类别作为数据框索引
    print(cluster_center)
    
    ##4.客户分群雷达图
    labels = ['ZL','ZR','ZF','ZM','ZC']
    legen = [' customers' + str(i + 1) for i in cluster_center.index]  # 客户群命名,作为雷达图的图例
    lstype = ['-',':','-.','--','-.']
    kinds = list(cluster_center.iloc[:, 0])
    # 由于雷达图要保证数据闭合,因此再添加L列,并转换为 np.ndarray
    cluster_center = pd.concat([cluster_center, cluster_center[['ZR']]], 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]]))
    import matplotlib.pyplot as plt
    # 绘图
    fig = plt.figure(figsize = (8,6))
    ax = fig.add_subplot(111, polar=True)  # 以极坐标的形式绘制图形
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    # 画线
    for i in range(len(kinds)):
        ax.plot(angle, centers[i], linestyle=lstype[i], linewidth=3, label=kinds[i])
    # 添加属性标签
    ax.set_thetagrids(angle * 180 / np.pi, labels)
    plt.title('Customer Profile Analysis')
    plt.legend(legen)
    plt.show()
    

    在这里插入图片描述
    结合业务分析,通过比较各个特征在群间的大小对某一个群的特征进行评价分析。其中客户群3在特征C处的值最大,在特征F、M处的值较小,说明客户群是偏好乘坐高级舱位的客户群;客户群2在特征F和M上的值最大,且在特征R上的值最小,说明客户群2的会员频繁乘机且近期都有乘机记录;客户群3在特征R处的值最大,在特征L、F、M和C处的值都较小,说明客户群3已经很久没有乘机,是入会时间较短的低价值的客户群;客户群4在所有特征上的值都很小,且在特征L处的值最小,说明客户群4属于新入会会员较多的客户群;客户群5在特征L处的值最大,在特征R处的值较小,其他特征值都比较适中,说明客户群5入会时间较长,飞行频率也较高,是有较高的价值的客户群。

    更多相关内容
  • 数据分析技术-航空公司客户价值分析(一)
  • 数据为某航空公司一段时间内有乘机记录的所有客户的形成的历史数据,44个特征,总共62988条记录。
  • 经过整理的航空公司客户价值分析代码与数据集,编程语言为Python。代码涉及到数据预处理与建模的各阶段。建模算法采用的是KMeans算法。
  • air_data.csv
  • 航空公司客户价值分析数据源(第7章).zip 详细文章教程如下:https://blog.csdn.net/Gabrielle_OyO/article/details/111406756 免费开源,欢迎补充
  • 二、依据RFM模型预处理航空客户数据        数据清洗        特征构建        数据标准化 三、使用K-...

    Python数据分析与应用----航空公司客户价值分析


    目录:

    一、RFM模型
    二、依据RFM模型预处理航空客户数据
           1.数据清洗
           2.特征构建
           3.数据标准化
    三、使用K-Means算法进行客户分群
    四、聚类结果可视化
           1.方法一
           2.方法二
           3.方法三
           4.方法解析


    某航空公司现状:以2014年3月31日为结束时间,选取宽度为两年的时间段作为分析窗口,抽取观测窗口内有乘机记录的所有客户的详细数据,形成历史数据62988条。
    现进行对客户数据分析,将客户分类并比较不同类别客户的客户价值,以便提供个性化服务,制定相应的营销策略,具体流程如下:
    在这里插入图片描述


    一、RFM模型

    1、什么是RFM模型

    R(Recency)是指用户的最近一次消费时间与截止时间的间隔,用最通俗的话说就是,用户最后一次下单时间距今天有多长时间了,这个指标与用户流失和复购直接相关,关系到公司最近的走向。

    F(Frequency)是指用户下单频率,就是用户在固定的时间段内消费了几次。这个指标反映了用户的消费活跃度。

    M(Monetary)是指用户消费金额,其实就是用户在固定的周期内在平台上花了多少钱,直接反映了用户对公司贡献的价值。

    本案例要求分类客户并对其价值分析评价,而识别客户价值应用最广泛的模型就是RFM模型。RFM模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标,来描述该客户的价值状况。

    2、RFM模型有什么作用

    RFM模型可以对客户的终生价值做一个合理的预估,基于一个理想的客户特征来衡量现实中客户价值的高低,通过此类分析,定位最有可能成为品牌忠诚客户的群体,让我们把主要精力放在最有价值的用户身上。
    在这里插入图片描述
    依据上述RFM模型,在已知的数据特征中我们后期可以选取必要的特征进行分析。

    返回顶部


    二、依据RFM模型预处理航空客户数据

    依据流程图,我们对航空客户数据依次进行数据清洗、特征构建以及数据标准化处理。

    1.数据清洗

    import numpy as np
    import pandas as pd
    
    # 读取数据
    airline_data = pd.read_csv('data/air_data.csv',encoding='gb18030')
    print('原始数据的形状为:',airline_data.shape)
    //原始数据的形状为: (62988, 44)
    

    利用notnull()方法取出非空数据,&—合并条件保留完整数据记录,loc切片保留最终非空数据。

    # 取出票价为空值的数据
    exp1 = airline_data['SUM_YR_1'].notnull()
    exp2 = airline_data['SUM_YR_2'].notnull()
    exp = exp1 & exp2
    airline_notnull = airline_data.loc[exp,:]
    print('删除缺失记录后的数据形状为:',airline_notnull.shape)
    //删除缺失记录后的数据形状为: (62299, 44)
    

    既然分析有价值客户,就必须得有数据,对于那些虽然非空但是为0的数据也需要清理掉。注意:这里在SUM_YR_1、SUM_YR_2的0值去除时使用的是(index1|index2),本身这两个特征代表的是观测窗口票价收入,个人理解是这里的1、2代表了两个窗口,也就是说一个人在这两个窗口的记录均为0时,才表示该客户从来没有乘坐过飞机,数据异常

    # 只保留票价非0的,或者平均折扣率不为0的且总飞行千米数大于0的
    index1 = airline_notnull['SUM_YR_1'] != 0  //保留观测窗口1不为零的数据
    index2 = airline_notnull['SUM_YR_2'] != 0  //保留观测窗口2不为零的数据
    index3 = (airline_notnull['avg_discount'] !=0) & (airline_notnull['SEG_KM_SUM']>0)
    airline = airline_notnull[(index1|index2) & index3]
    print('删除异常记录后的数据形状为:',airline.shape)
    //删除异常记录后的数据形状为: (62044, 44)
    

    返回顶部


    2.特征构建

    基于RFM模型,我们需要能表示时间间隔的、表示单位时间内购买产品频率的以及单位时间内购买产品总资金的特征。但是由于航空票价受到运输距离和舱位等级的影响,同样的消费金额的不同旅客对于航空公司的价值是不同的。比如:短航线高等仓的客户就比长航线低等舱的客户价值更高些,所以此处借一段时间内的飞行里程(M)与舱位对应折扣系数的均值(C)来代替消费金额。另外,航空公司会员入会时间的长短在一定程度上也能够影响客户价值,所以在原来模型上添加客户关系长度(L),作为区分客户的另一特征。

    模型LRFMC
    航空公司LRFMC模型会员入会时间距观测窗口结束的月数客户最近一次乘坐飞机距观测窗口结束的月数客户在观测窗口内乘坐飞机的次数客户在观测窗口累计的飞行里程客户在观测窗口内乘坐舱位对应折扣系数的均值

    R = LAST_TO_END              F = FLIGHT_COUNT
    M = SEG_KM_SUM              C = AVG_DISCOUNT

    对比模型与实际数据供应,我们发现在客户基本信息列中仅有表示客户入会员时间列,此时特征 L 需要我们自行构建。

    L = LOAD_TIME - FFP_DATE

    # 选取构建 LRFMC 的特征
    airline_selection = airline[['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','LAST_TO_END','avg_discount','SEG_KM_SUM']]
    
    # 构建 L 特征
    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)
    print(airline_features)
    
                    0  FLIGHT_COUNT  LAST_TO_END  avg_discount  SEG_KM_SUM
    0       90.200000           210            1      0.961639      580717
    1       86.566667           140            7      1.252314      293678
    2       87.166667           135           11      1.254676      283712
    3       68.233333            23           97      1.090870      281336
    4       60.533333           152            5      0.970658      309928
    ...           ...           ...          ...           ...         ...
    62974  108.300000             2           89      0.710000         368
    62975   65.366667             2          121      0.670000         368
    62976   45.400000             2           39      0.225000        1062
    62977   15.533333             2          464      0.250000         904
    62978   36.066667             2          282      0.280000         760
    
    [62044 rows x 5 columns]
    

    返回顶部


    3.数据标准化

    数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。
    在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

    # 标准差标准化数据
    from sklearn.preprocessing import StandardScaler
    
    data = StandardScaler().fit_transform(airline_features)
    np.savez('tmp/airline_scale.npz',data)
    print('标准化后 LRFMC 模型的5个特征为:\n',data)
    标准化后 LRFMC 模型的5个特征为:
     [[ 1.43571897 14.03412875 -0.94495516  1.29555058 26.76136996]
     [ 1.30716214  9.07328567 -0.9119018   2.86819902 13.1269701 ]
     [ 1.32839171  8.71893974 -0.88986623  2.88097321 12.65358345]
     ...
     [-0.14942206 -0.70666211 -0.73561725 -2.68990622 -0.77233818]
     [-1.20618274 -0.70666211  1.6056619  -2.55464809 -0.77984321]
     [-0.47965977 -0.70666211  0.60304353 -2.39233833 -0.78668323]]
    

    返回顶部


    三、使用K-Means算法进行客户分群

    K-Means算法是一种基于质心的划分方法,给定聚类个数K,以及包含n个数据对象的数据库,输出满足误差平方和最小标准的k个聚类,算法步骤如下:

    • 1.从n个样本数据中随机选取k个对象作为初始的聚类中心
    • 2.分别计算出每个样本到各个聚类质心的距离,将样本分配到距离最近的那个聚类中心类别中
    • 3.所有样本分配完后,再重新计算k个聚类的中心
    • 4.与前一次计算得到的k个聚类中心比较,若聚类中心变化,返回步骤2,继续;否则转到5
    • 5.当质心不发生变化时停止并输出聚类结果。

    聚类的结果依赖于初始聚类中心的随机选择。在实践中,为了得到好的效果,通常以不同的初始聚类中心多次运行K-Means算法。在所有的样本分配后,重新计算k个聚类的中心时,对于连续的数据,聚类中心取该簇的均值。

    在这里插入图片描述

    上面将ariline_scale保存时以单个数组形式保存,非关键字参数传递的数组自动取名为arr_0,所以在读取提出数据时要添加列名。

    import pandas as pd 
    import numpy as np
    from sklearn.cluster import KMeans
    //将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数
    //为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个
    //save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容.
    ariline_scale = np.load('tmp/airline_scale.npz')['arr_0']
    // 确定聚类中心数
    k = 5 
    // 构建模型
    kmeans_model = KMeans(n_clusters=k,n_jobs=4,random_state = 123)
    // 训练模型
    fit_kmeans = kmeans_model.fit(ariline_scale)
    // 查看聚类中心
    kmeans_model.cluster_centers_ 
    array([[ 0.04240079, -0.23143046, -0.00322862,  2.17190116, -0.23585705],
           [-0.31316114, -0.57390748,  1.68689725, -0.17497219, -0.53673986],
           [ 0.48366129,  2.48319491, -0.79940665,  0.30924046,  2.42447899],
           [-0.70029836, -0.16066112, -0.41507386, -0.25783497, -0.16039479],
           [ 1.16094184, -0.08663559, -0.37743838, -0.15689301, -0.09454205]])
    
    // 查看聚类样本的分类标签
    kmeans_model.labels_
    array([2, 2, 2, ..., 3, 1, 1])
    
    // 统计不同类别的样本数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    print('最终分类每个样本的数目为:\n',r1)
    最终分类每个样本的数目为:
    3    24618
    4    15733
    1    12114
    2     5337
    0     4242
    dtype: int64
    

    四、聚类结果可视化

    1.方法一:

    整理数据:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = 'SimHei'
    plt.rcParams['font.size'] = 12.0
    plt.rcParams['axes.unicode_minus'] = False
    
    # 统计不同类别的样本数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    # 找出聚类中心
    r2 = pd.DataFrame(kmeans_model.cluster_centers_ )
    
    r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目
    r.columns = list(pd.DataFrame(ariline_scale).columns) + [u'类别数目'] #重命名表头
    print(r)
              0         1         2         3         4   类别数目
    0  0.042401 -0.231430 -0.003229  2.171901 -0.235857   4242
    1 -0.313161 -0.573907  1.686897 -0.174972 -0.536740  12114
    2  0.483661  2.483195 -0.799407  0.309240  2.424479   5337
    3 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395  24618
    4  1.160942 -0.086636 -0.377438 -0.156893 -0.094542  15733
    center_num = r.values
    print(center_num)
    //[[ 4.24007883e-02 -2.31430460e-01 -3.22861506e-03  2.17190116e+00
    //  -2.35857054e-01  4.24200000e+03]
    // [-3.13161141e-01 -5.73907480e-01  1.68689725e+00 -1.74972187e-01
    //  -5.36739860e-01  1.21140000e+04]
    // [ 4.83661293e-01  2.48319491e+00 -7.99406654e-01  3.09240458e-01
    //   2.42447899e+00  5.33700000e+03]
    // [-7.00298357e-01 -1.60661116e-01 -4.15073856e-01 -2.57834972e-01
    //  -1.60394792e-01  2.46180000e+04]
    // [ 1.16094184e+00 -8.66355853e-02 -3.77438378e-01 -1.56893014e-01
    //  -9.45420456e-02  1.57330000e+04]]
    

    绘图:

    fig=plt.figure(figsize=(10, 8))
    ax = fig.add_subplot(111, polar=True)
      
    feature = ["入会时间", "飞行次数", "时间间隔差值", "平均折扣率", "总里程"]
    N =len(feature)
    for i, v in enumerate(center_num): //
        # 设置雷达图的角度,用于平分切开一个圆面
        angles=np.linspace(0, 2*np.pi, N, endpoint=False)
        # 为了使雷达图一圈封闭起来,需要下面的步骤
        center = np.concatenate((v[:-1],[v[0]]))
        angles = np.concatenate((angles,[angles[0]]))
        # 绘制折线图
        ax.plot(angles, center, 'o-', linewidth=2, label = "第%d簇人群,%d人"% (i+1,v[-1]))
        # 填充颜色
        ax.fill(angles, center, alpha=0.25)
        # 添加每个特征的标签
        ax.set_thetagrids(angles * 180/np.pi, feature, fontsize=15)
        # 设置雷达图的范围
        ax.set_ylim(min-0.1, max+0.1)
        # 添加标题
        plt.title('客户群特征分析图', fontsize=20)
        # 添加网格线
        ax.grid(True)
        # 设置图例
        plt.legend(loc='upper right', bbox_to_anchor=(1.3,1.0),ncol=1,fancybox=True,shadow=True)
        
    # 显示图形
    plt.show()
    

    在这里插入图片描述

    enumerate()枚举:设置变量时第二个变量代表所要枚举数据中的第i个值。

    b=[1,2,3,4,5,6]
    for i,item in enumerate(b):
        print (i, item)
     
    Output:
    0 1
    1 2
    2 3
    3 4
    4 5
    5 6
    

    返回顶部


    2.方法二:

    整理数据:

    r1=pd.Series(kmeans_model.labels_).value_counts()
    r2=pd.DataFrame(kmeans_model.cluster_centers_)
    
    r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',])
    r=pd.concat([r3,r1,r2],axis=1)
    
    r.columns=['聚类类别','聚类个数']+list(pd.DataFrame(data).columns)
    print(r)
       聚类类别   聚类个数         0         1         2         3         4
    0  客户群1   4242  0.042401 -0.231430 -0.003229  2.171901 -0.235857
    1  客户群2  12114 -0.313161 -0.573907  1.686897 -0.174972 -0.536740
    2  客户群3   5337  0.483661  2.483195 -0.799407  0.309240  2.424479
    3  客户群4  24618 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395
    4  客户群5  15733  1.160942 -0.086636 -0.377438 -0.156893 -0.094542
    
    //转置
    r4=r2.T
    r4.columns=list(pd.DataFrame(data).columns)
    
    y=[]
    
    for x in list(pd.DataFrame(data).columns):
        dt= r4[x]
        dt=np.concatenate((dt,[dt[0]]))
        y.append(dt)
    

    绘制图形:

    #绘制雷达图
    // 设置中文
    plt.rcParams['font.sans-serif']=['SimHei'] 
    // 设置画布大小
    fig = plt.figure(figsize=(10,8))
    //标签
    labels = np.array(list(pd.DataFrame(data).columns))
    //数据个数
    dataLenth = 5
    //设置子图    
    ax = fig.add_subplot(111, polar=True)
    
    angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
    angles = np.concatenate((angles, [angles[0]]))
    
    ax.plot(angles, y[0], 'b-', linewidth=2)
    ax.plot(angles, y[1], 'r-', linewidth=2)
    ax.plot(angles, y[2], 'g-', linewidth=2)
    ax.plot(angles, y[3], 'y-', linewidth=2)
    ax.plot(angles, y[4], 'm-', linewidth=2)
    
    ax.legend(r3,loc=1)
    ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
    ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")
    ax.grid(True)
    plt.show()
    

    在这里插入图片描述

    返回顶部


    3.方法三:

    //做可视化:
    plt.figure(figsize=(6,6))
    L=5
    angles = np.linspace(0, 2*np.pi, L, endpoint=False)
    labels = ['L', 'F', 'R', 'C', 'M']
    data = kmeans_model.cluster_centers_
    //闭合曲线:
    angles = np.concatenate((angles, [angles[0]]))
    //为了形成闭合,把二维数组每一行下标为0的数拼接到列,
    // 二维数组与二维数组拼接,
    //所以reshape成二维的,且变成五列一行
    data = np.concatenate((data, data[:,0].reshape(5,1)),axis=1).T
    // print('angles',angles)
    print('data:\n',data)
    //绘图:
    plt.polar(angles, data)
    plt.xticks(angles, labels)
    plt.show()
    

    在这里插入图片描述

    返回顶部


    4.方法解析:

    其实说到底,要绘制这样的雷达图我们只需要两样东西:数据和绘图方法。绘图方法在matplotlib库中已经提供了,接下来就是我们找到数据,并加以处理,使之能够应用到绘图方法中去。
    就拿第二种方法为例:(解析时为了方便代码会有所改动)

    数据处理:

    r1=pd.Series(kmeans_model.labels_).value_counts()
    r2=pd.DataFrame(kmeans_model.cluster_centers_)
    
    r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',])
    r=pd.concat([r3,r1,r2],axis=1)
    
    r.columns=['聚类类别','聚类个数']+list(pd.DataFrame(data).columns)
    print(r)
       聚类类别   聚类个数         0         1         2         3         4
    0  客户群1   4242  0.042401 -0.231430 -0.003229  2.171901 -0.235857
    1  客户群2  12114 -0.313161 -0.573907  1.686897 -0.174972 -0.536740
    2  客户群3   5337  0.483661  2.483195 -0.799407  0.309240  2.424479
    3  客户群4  24618 -0.700298 -0.160661 -0.415074 -0.257835 -0.160395
    4  客户群5  15733  1.160942 -0.086636 -0.377438 -0.156893 -0.094542
    
    //转置
    r4=r2.T
    r4.columns=list(pd.DataFrame(data).columns)
    
    y=[]
    
    for x in list(pd.DataFrame(data).columns):
        dt= r4[x]
        dt=np.concatenate((dt,[dt[0]]))
        y.append(dt)
    

    为了清洗方便的处理在得到聚类中心转为DataFrame时,直接设置了索引和列名,方便看出转置后的变化。

    r1 = pd.Series(kmeans_model.labels_).value_counts()
    r2 = pd.DataFrame(kmeans_model.cluster_centers_,columns=['L', 'F', 'R', 'C', 'M'],index=['客户群1','客户群2','客户群3','客户群4','客户群5'])
    print('r2:\n',r2)
    

    在这里插入图片描述
    利用转置,将数据行列互换位置,一列表示某一客户群的LFRCM模型数据

    r4 = r2.T
    print('r4\n',r4)
    

    在这里插入图片描述
    将数据表的列转换为数值型,否则下面循环时dt = r4[x]会报错,因为不该为数值型,在遍历匹配时,字符型不相匹配。还有一点就是,data在读取数据后类型为naddery不能直接赋.columns,需要将其转为DataFrame类型才可以。

    r4.columns = list(pd.DataFrame(data).columns)
    print('r4.columns:\n',r4)
    

    在这里插入图片描述

    这一步至关重要,这幅图关键就是以闭合、多方位的形式展现数据。该步骤就是对每一列数据进行收尾闭合。numpy.concatenate() 方法能够解决闭合问题!

    y=[]
    
    for x in list(pd.DataFrame(data).columns):
        dt= r4[x]
        dt=np.concatenate((dt,[dt[0]]))
        y.append(dt)
        print(y)
    

    在这里插入图片描述
    反观方法一方法三,在数据处理是都有这方面的考虑,只是三种方法考虑问题的先后。
    所谓先后就是整体的流程:
    1.找到数据,把数据处理好了,再去画图
    2.在画图的同时,遍历处理当下对应的数据

    在这里插入图片描述
    在这里插入图片描述
    绘图:
    在绘图这方面就是采用matplotlib库提供的绘图方法:

    1.matplotlib.pyplot.polar() 关于极区图 / 极坐标图 / 雷达图的绘制
    2.matplotlib.pyplot.thetagrids() :
    matplotlib.pyplot.thetagrids() 方法用于获取并设置当前极区图上的极轴。

    基本语法:matplotlib.pyplot.thetagrids(angles, labels=None, fmt=None, **kwargs)
    
    参数描述
    angles网格线的角度,浮点数、度数组成的元组
    labels每个极轴要使用的文本标签,字符串组成的元组
    fmt格式化 angles 参数,如 ‘%1.2f’ 保留两位小数,注意,将使用以弧度为单位的角度
    **kwargs其他关键字参数,参见官方文档

    在这里插入图片描述
    在这里插入图片描述
    3.np.linspace():

    np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
    

    在规定的时间内,返回固定间隔的数据。他将返回“num”个等间距的样本,在区间[start, stop]中。其中,区间的结束端点可以被排除在外。

    属性说明
    start队列的开始值
    stop队列的结束值
    num要生成的样本数,非负数,默认是50
    endpoint若为True,“stop”是最后的样本;否则“stop”将不会被包含。默认为True
    retstep若为False,返回等差数列;否则返回array([samples, step])。默认为False、

    返回顶部


    说明:

    会有人疑惑这里的图与教材上的图形不同,那是肯定的,按照教材上的代码画出来并非教材原图,因为教材给出的图是按照 LFRMC模型的顺序做的,可给出的源码实例并不是那个顺序。所以只需要在选择特征时把顺序改过来就好了,至于其他图形信息自行设置即可。
    在这里插入图片描述
    在这里插入图片描述

    返回顶部


    本文相关源码下载:https://download.csdn.net/download/qq_45797116/74466893

    展开全文
  • 航空数据分析

    2021-02-13 08:35:42
    航空数据分析 介绍 今天产生了大量的数据,大数据分布在大多数域中。 可以将大数据用于航班延误分析也就不足为奇了。 有几个相关因素会影响航班延误以及航班取消。 因此有必要找出与此类问题相关的原因。 改善客户...
  • - 2.[开始数据分析](#2) - [数据探索](#2) - [Part Ⅰ:数据预处理](#2.0) - [数据清洗](#2.1) - [数据集成](#2.2) - [数据归约](#2.3) - [数据变换](#2.4) - [Part Ⅱ:建模分析和性能评估](#...
  • 二八定律: 20%的客户,为企业带来约80%的利益。 在竞争激烈的航空市场里,很多航空公司都推出了优惠的 营销方式来吸引更多的客户。...如果分析航空公司客户价值 ,此模型不再适用,存在一些缺陷和不足:
  • 航空公司客户价值分析完整代码 项目背景:为某航空公司需要以客户为中心,按照客户的需求,在对客户的特点了解上使用不同的营销手段,目的是争取更多新客户,降低客户流失率,降低服务成本,提高业务收入,增加ARPU...
  • 基于数据挖掘的航空公司客户价值分析.pdf
  • 航空公司数据
  • 《Rapid Miner数据分析与挖掘实战》第20章 航空公司客户价值分析,word文档及相关数据
  • ⑴借助航空公司的客户数据,对客户进行分类;⑵对不同类的客户类别进行特征分析,比较不同类客户的客户价值;⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;⑷...
  • 数据分析技术-航空公司客户价值分析(二) 1.复习如何使用python选取构建LRFMC模型需要的特征 2.使用sklearn相关功能模块标准化LRFMC模型的特征 3.使用sklearn的cluster模块提供的kmeans函数对不同客户群体LRMFC...
  • 通过建立合理的客户价值评估模型,对客户进行分群,分析比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提供个性化的客户服务是必须的和有效的。目前该航空公司已积累了大量的会员档案信息和其乘坐...
  • 建立合理的客户价值评估模型,对客户进行分群
  • 航空公司客户价值大数据分析全部的源代码,使用python编写,含数据部分
  • ;1;分析航空公司现状;分析航空公司现状;目前航空公司已积累了大量的会员档案信息和其乘坐航班记录 以2014-03-31为结束时间选取宽度为两年的时间段作为分析观测窗口抽取观测窗口内有乘机记录的...借助航空公司客户数据
  • 在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提示企业竞争力,为企业带来更多的利益。 2.传统方法存在的缺陷 广泛用于分析客户...

    1.案例背景

    • 二八定律: 20%的客户,为企业带来约80%的利益。
    • 在企业的客户关系管理中,对客户分类,区分不同价值的客户。针对不同价值的客户提供个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值客户,实现企业利润最大化目标。
    • 在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提示企业竞争力,为企业带来更多的利益。

    2.传统方法存在的缺陷

    广泛用于分析客户价值的是RFM模型,它是通过三个指标(最近消费时间间隔(Recency)、消费频率(Frequency)、消费金额(Monetary))来进行客户细分,识别出高价值的客户。如果分析航空公司客户价值,此模型不再适用,存在一些缺陷和不足:

    一:在模型中,消费金额表示在一段时间内,客业产品金额的总和。因航空票价受到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。因此这个指标并不适合用于航空公司的客户价值分析。
    二:传统模型分析是利用属性分箱方法进行分析如图,但是此方法细分的客户群太多,需要一一识别客户特征和行为,提高了针对性营销的成本。

    在这里插入图片描述

    3.原始数据说明

    客户信息属性说明,针对航空客户的信息,对每个属性进行相应说明。
    在这里插入图片描述
    航空客户信息,其中已经包含会员档案信息和其乘坐航班记录等
    在这里插入图片描述

    4.挖掘目标

    1、借助航空公司客户数据,对客户进行分类;
    2、对不同的客户类别进行特征分析,比较不同类客户的客户价值;
    3、对不同价值的客户类别提供个性化服务,制定相应的营销策略。

    5.分析方法与过程

    初步分析:提出使用航空公司的LRFMC模型

    因消费金额指标在航空公司中不适用,故选择客户在一定时间内累积的飞行里程M和客户乘坐舱位折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员加入时间在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一指标,因此构建出LRFMC模型。

    采用聚类的方法对客户进行细分,并分析每个客户群的特征,识别其客户价值。

    总体流程:
    在这里插入图片描述

    5.1数据抽取

    以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据。对于后续新增的客户详细信息,利用其数据中最大的某个时间点作为结束时间,采用上述同样的方法进行抽取,形成增量数据。

    根据末次飞行日期,从航空公司系统内抽取2012-04-01至2014-03-31内所有乘客的详细数据

    5.2探索分析

    #-*- coding: utf-8 -*- 
    #对数据进行基本的探索
    #返回缺失值个数以及最大最小值
    
    import pandas as pd
    
    datafile= '../data/air_data.csv' #航空原始数据,第一行为属性标签
    resultfile = '../tmp/explore.xls' #数据探索结果表
    
    data = pd.read_csv(datafile, encoding = 'utf-8') #读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)
    
    explore = data.describe(percentiles = [], include = 'all').T #包括对数据的基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等);T是转置,转置后更方便查阅
    explore['null'] = len(data)-explore['count'] #describe()函数自动计算非空值数,需要手动计算空值数
    
    explore = explore[['null', 'max', 'min']]
    explore.columns = [u'空值数', u'最大值', u'最小值'] #表头重命名
    '''这里只选取部分探索结果。
    describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、top(频数最高者)、freq(最高频数)、mean(平均值)、std(方差)、min(最小值)、50%(中位数)、max(最大值)'''
    
    explore.to_excel(resultfile) #导出结果
    

    在这里插入图片描述

    • 原始数据中存在票价为空值,票价为空值的数据可能是客户不存在乘机记录造成。
    • 票价最小值为0、折扣率最小值为0、总飞行公里数大于0的数据。其可能是客户乘坐0折机票或者积分兑换造成。

    5.3数据预处理

    5.3.1数据清洗

    (1)丢弃票价为空的数据。
    (2)丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的数据。

    #-*- coding: utf-8 -*-
    #数据清洗,过滤掉不符合规则的数据
    
    import pandas as pd
    
    datafile= '../data/air_data.csv' #航空原始数据,第一行为属性标签
    cleanedfile = '../tmp/data_cleaned.csv' #数据清洗后保存的文件
    
    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] #该规则是“或”
    
    data.to_excel(cleanedfile) #导出结果
    

    5.3.2属性规约

    原始数据中属性太多,根据LRFMC模型,选择与其相关的六个属性,删除不相关、弱相关或冗余的属性。
    在这里插入图片描述

    5.3.3数据变换

    (1)属性构造
    因原始数据中并没有直接给出LRFMC五个指标,需要构造这五个指标。

    L = LOAD_TIME - FFP_DATE
    会员入会时间距观测窗口结束的月数 = 观测窗口的结束时间 - 入会时间[单位:月

    R = LAST_TO_END
    客户最近一次乘坐公司飞机距观测窗口结束的月数 = 最后一次乘机时间至观察窗口末端时长[单位:月]

    F = FLIGHT_COUNT
    客户在观测窗口内乘坐公司飞机的次数 = 观测窗口的飞行次数[单位:次]

    M = SEG_KM_SUM
    客户在观测时间内在公司累计的飞行里程 = 观测窗口总飞行公里数[单位:公里]

    C = AVG_DISCOUNT
    客户在观测时间内乘坐舱位所对应的折扣系数的平均值 = 平均折扣率[单位:无]
    (2)数据标准化

    #-*- coding: utf-8 -*-
    #标准差标准化
    
    import pandas as pd
    
    datafile = '../data/zscoredata.xls' #需要进行标准化的数据文件;
    zscoredfile = '../tmp/zscoreddata.xls' #标准差化后的数据存储路径文件;
    
    #标准化处理
    #或者可以直接使用zscore()实现
    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(zscoredfile, index = False) #数据写入
    

    在这里插入图片描述

    5.4模型构建

    5.4.1客户K-Means聚类

    采用K-Means聚类算法对客户数据进行分群,将其聚成五类(需要结合业务的理解与分析来确定客户的类别数量)。

    #-*- coding: utf-8 -*-
    #K-Means聚类算法
    
    import pandas as pd
    import numpy as np
    from pandas.core.frame import DataFrame
    from sklearn.cluster import KMeans #导入K均值聚类算法
    
    inputfile = '../tmp/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) #训练模型
    
    # kmodel.cluster_centers_ #查看聚类中心
    labels=kmodel.labels_ #查看各样本对应的类别
    label=DataFrame(labels)
    # print(label.value_counts())
    # print(kmodel.cluster_centers_ )
    
    result=DataFrame(kmodel.cluster_centers_)
    
    result.columns={'ZL','ZR','ZF','ZM','ZC'}
    result.to_excel("C://Python//DataAndCode//chapter7//demo//data//result.xls",index=False)
    
    

    聚类结果:
    在这里插入图片描述
    聚类后的数据集:
    在这里插入图片描述
    绘制雷达图:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Dec  5 17:16:39 2021
    
    @author: 守住1.份坚持
    """
    
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    # 用于正常显示中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    #用于正常显示符号
    plt.rcParams['axes.unicode_minus'] = False
     
    # 使用ggplot的绘图风格,这个类似于美化了,可以通过plt.style.available查看可选值,你会发现其它的风格真的丑。。。
    plt.style.use('ggplot')
    
    data=pd.read_excel("C://Python//DataAndCode//chapter7//demo//data//result.xls")
    feature=['ZL','ZR','ZF','ZM','ZC']
    values1=data.loc[:,['ZL']]
    values2=data.loc[:,['ZR']]
    values3=data.loc[:,['ZF']]
    values4=data.loc[:,['ZM']]
    values5=data.loc[:,['ZC']]
    
    # 设置每个数据点的显示位置,在雷达图上用角度表示
    angles=np.linspace(0, 2*np.pi,len(feature), endpoint=False)
    angles=np.concatenate((angles,[angles[0]]))
    # 绘图
    fig=plt.figure()
    
    for values in [values1, values2,values3,values4,values5]:
    # 拼接数据首尾,使图形中线条封闭
        values=np.concatenate((values,[values[0]]))
        # 设置为极坐标格式
        ax = fig.add_subplot(111, polar=True)
        # 绘制折线图
        ax.plot(angles, values, 'o-', linewidth=2)
        # 填充颜色
        ax.fill(angles, values, alpha=0.25)
         
        # 设置图标上的角度划分刻度,为每个数据点处添加标签
        ax.set_thetagrids(angles * 180/np.pi, feature)
         
        # 设置雷达图的范围
        ax.set_ylim(0,5)
    # 添加标题
    plt.title('客户群特征分析图')
    # 添加网格线
    ax.grid(True)
     
    plt.show()
    

    在这里插入图片描述

    5.4.2客户价值分析

    对聚类结果进行特征分析,其中客户群1在F、M属性最大,在R属性最小;客户群2在L属性上最大;客户群3在R属性上最大,在F、M属性最小;客户群4在L、C属性上最小;客户群5在C属性上最大。

    根据业务定义五个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户。

    在这里插入图片描述

    5.4.3扩展思考

    在国内航空市场竞争日益激烈的背景下,客户流失问题是影响公司利益的重要因素之一。如何如何改善流失问题,继而提高客户满意度、忠诚度,维护自身的市场和利益?

    客户流失分析可以针对目前老客户进行分类预测。针对航空公司客户信息数据附件(见:/示例程序/air_data.csv)可以进行老客户以及客户类型的定义(例如:将其中将飞行次数大于6次的客户定义为老客户,已流失客户定义为:第二年飞行次数与第一年飞行次数比例小于50%的客户等)。

    选取客户信息中的关键属性如:会员卡级别,客户类型(流失、准流失、未流失),平均折扣率,积分兑换次数,非乘机积分总和,单位里程票价,单位里程积分等。通过这些信息构建客户的流失模型,运用模型预测未来客户的类别归属(未流失、准流失,或已流失)。

    展开全文
  • 本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点和价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。在这里是用K-...

    一.引言

    本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点和价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。在这里是用K-
    means聚类方法来对乘客进行分群的。

    源数据部分如下图所示:

    各属性解释如下:

    ![](https://img-
    blog.csdn.net/2018051615505298?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAzNjY0MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

    二.数据探索

    通过调用describe()函数对数据进行一个大致的了解,主要是查看缺失值和异常值。通过观察发现,存在票价为零,折扣率为0,总飞行数为0的情况。通过简单处理,我输出了一个包含个属性空值个数,最大值,最小值数据的表格。部分如下:

    对应代码:

        import pandas as pd
        datafile='D:/航空公司客户价值分析/data/air_data2.csv'
        resultfile='D:/航空公司客户价值分析/explore.xls'
        data=pd.read_csv(datafile)
        explore=data.describe().T#对数据的统计性描述,T是我进行了转置
        explore['null']=len(data)-explore['count']
        df=explore[['max','min','null']]
        df.to_excel(resultfile)
    [/code]
    
    三.数据预处理
    
    1.数据清洗
    
    通过上一步的数据探索分析发现数据中存在缺失值,而这一部分的比例相对较小,故直接删掉。具体处理如下:
    
      * 丢弃票价为空的记录 
      * 丢弃票价为0,平均折扣率不为0且总飞行公里数大于零的记录。 
    
    2.属性规约与数据变换
    
    原始数据中的属性太多。而评估航空公司客户价值通常根据LRFMC模型,与其相关的只有6个属性即,FFP_DATE、LOAD_TIME、FLIGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END。  
    
    简单介绍下LRFMC模型,即客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C。这五个指标为评价客户价值的重要因素,而上面6个属性与这5个指标的关系如下:  
    
      * L=LOAD_TIME-FFP_DATE 
    
    会员入会时间距观测窗口结束的月数=观测窗口结束的时间-入会时间
    
      * R=LAST_TO_END 
    
    客户最近一次乘坐公司飞机距观测窗口结束的月数=最后一次乘机时间至观察窗口末端时长[单位:月]  
    
      * F=FLIGHT_COUNT 
    
    客户在观测窗口内乘坐公司飞机的次数=观测窗口的飞行次数[单位:次]  
    
      * M=SEG_KM_SUM 
    
    客户在观测时间内在公司累计的飞行里程=观测窗口的总飞行公里数[单位:公里]  
    
      * C=AVG_DISCOUNT 
    
    客户在观测时间内乘坐舱位所对应的折扣系数的平均值=平均折扣率
    
    提取了相关的数据后,发现这5个指标的取值范围相差较大所以需对数据进行标准化处理。
    
    代码如下:
    
    ```code
        import pandas as pd
        import datetime
        #数据清洗
        #删除空值,异常值
        datafile='D:/航空公司客户价值分析/data/air_data2.csv'
        resultfile='D:/航空公司客户价值分析/data_cleaned.csv'
        data=pd.read_csv(datafile)
        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]
        data.to_csv(resultfile,encoding = 'utf_8_sig')#输出为utf8格式,不然excel打开中文会乱码
        
        
        #属性规约与数据变换
        #根据航空公司的LRFMC价值指标,删除掉无关属性
        d1,d2=[],[]
        for x in data['LOAD_TIME']:
            d1.append(datetime.datetime.strptime(x,'%Y/%m/%d'))
        for y in data['FFP_DATE']:
            d2.append(datetime.datetime.strptime(y,'%Y/%m/%d'))
            
        d3=[d1[i]-d2[i] for i in range(len(d1))]
        data['L']=[round((x.days/30),2) for x in d3]
        data2=data[['L','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
        data2.columns=['L','R','F','M','C']
        data2.to_csv('D:/航空公司客户价值分析/zscoredata.csv',encoding = 'utf_8_sig',index=False)
    [/code]
    
    输出为:
    
    ![](https://img-blog.csdn.net/20180516164553437)  
    
    将以上数据进行零—均值标准化:
    
    ```code
        import pandas as pd
        datafile='D:/航空公司客户价值分析/zscoredata.csv'
        resultfile='D:/航空公司客户价值分析/standard_data.csv'
        data=pd.read_csv(datafile)
        data=(data-data.mean(axis=0))/(data.std(axis=0))
        data.columns=['Z'+i for i in data.columns]
        data.to_csv(resultfile,encoding = 'utf_8_sig',index=False)
    [/code]
    
    此时输出为:
    
    ![](https://img-blog.csdn.net/20180516164816890)  
    
    四.模型构建
    
    客户价值分析模型由两个部分构成。第一个部分是根据航空公司客户5个指标,对客户进行聚类分群,第二部分是对分群后的客户群进行特征分析,并对客户群的客户价值进行排名。  
    
    1.K-Means聚类算法对客户数据进行分群,k=5,即把客户分成5类。k-means位于scikit-Learn库中,需要先安装这个库。
    
    ```code
        import pandas as pd
        import numpy as np
        import matplotlib.pyplot as plt
        from sklearn.externals import joblib
        from sklearn.cluster import KMeans
        if __name__=='__main__':#防止模块范围内的代码在子进程中被重新执行,因为Windows中没有fork()函数
            datafile='D:/航空公司客户价值分析/standard_data.csv'
            resultfile='D:/航空公司客户价值分析/kmeans.csv'
            k=5
            data=pd.read_csv(datafile)
            #调用K-Means方法进行聚类分析
            kmodel=KMeans(n_clusters=k,n_jobs=4)#n_jobs是并行数,一般赋值为电脑的CPU数。
            # #save model
            # joblib.dump(kmodel,'kmeans.model',compress=3)
            # #load model to model
            # model=joblib.load('kmeans.model')
            kmodel.fit(data)
            r1=pd.Series(kmodel.labels_).value_counts()
            r2=pd.DataFrame(kmodel.cluster_centers_)
            r3=pd.Series(['客户群1','客户群2','客户群3','客户群4','客户群5',])
            r=pd.concat([r3,r1,r2],axis=1)
            
            r.columns=['聚类类别','聚类个数']+list(data.columns)
            r.to_csv(resultfile,encoding = 'utf_8_sig',index=False)
    [/code]
    
    输出聚类分析结果:
    
    ![](https://img-blog.csdn.net/20180516173351260)  
    
    上图可以看到各个类群的客户个数,及聚类中心。
    
    2.客户价值分析
    
    针对上面的聚类结果,对客户进行特征分析,绘制雷达图。
    
    ```code
        #绘制雷达图
            labels = np.array(list(data.columns))#标签
            dataLenth = 5#数据个数
            r4=r2.T
            r4.columns=list(data.columns)
            fig = plt.figure()
            y=[]
            for x in list(data.columns):
                dt= r4[x]
                dt=np.concatenate((dt,[dt[0]]))
                y.append(dt)
            ax = fig.add_subplot(111, polar=True)
            angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
            angles = np.concatenate((angles, [angles[0]]))
            ax.plot(angles, y[0], 'b-', linewidth=2)
            ax.plot(angles, y[1], 'r-', linewidth=2)
            ax.plot(angles, y[2], 'g-', linewidth=2)
            ax.plot(angles, y[3], 'y-', linewidth=2)
            ax.plot(angles, y[4], 'm-', linewidth=2)
            plt.rcParams['font.sans-serif']=['SimHei'] 
            ax.legend(r3,loc=1)
            ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
            ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")
            ax.grid(True)
            plt.show()
    [/code]
    
    ![](https://img-blog.csdn.net/20180516174923537)
    
    由上图可以很清晰的看到每个客户群的指标情况,将每个客户群的优势特征,劣势特征总结如下:
    
    优势特征:
    
    客户群1:R
    
    客户群2:F、M、L
    
    客户群3:L
    
    客户群4:C
    
    客户群5:无
    
    劣势特征:
    
    客户群1:F、M
    
    客户群2:R
    
    客户群3:R、F、M、C
    
    客户群4:F、M
    
    客户群5:R、L、C
    
    基于LRFMC模型的具体含义,我们可以对这5个客户群进行价值排名。同时,将这5个客户群重新定义为五个等级的客户类别:重要保持客户,重要挽留客户,重要发展客户,一般客户,低价值客户。
    
      * 重要保持客户:这类客户平均折扣率(C)和入会员时间(L)都很高(入会员时间越长,会员级别越高,折扣越大),最近乘坐过本航班时间间隔(R)低,乘坐的次数(F)或(M)高。说明他们经常乘坐飞机,且有一定经济实力,是航空公司的高价值 客户。对应客户群2。 
      * 重要发展客户:这类客户平均折扣率高(C),最近乘坐过本航班时间间隔(R)短,但是乘坐的次数(F)和(M)都很低。说明这些乘客刚入会员不久,所以乘坐飞机次数少,是重要发展客户,对应客户群4。 
      * 重要挽留客户:这类客户入会时间长(L),最近乘坐过本航班时间间隔(R)较长,里程数和乘坐次数都变低,为重要挽留客户。对应客户群3 
      * 一般与低价值客户:这类客户乘坐时间间隔长(R)或乘坐次数(F)和总里程(M)低,平均折扣也很低。对应客户群5和客户群1. 
    
    针对以上不同的价值客户群,航空公司应当及时出台相应的营销策略,针对不同的客户群提供相应的产品和服务,提升客户价值,维持和稳定重要客户,挽留高价值客户的流失。价值排名如下:
    
    ![](https://img-blog.csdn.net/20180516185322417)  
    
    因为乘客情况是实时变动的,所以该模型并不稳定,应根据实际情况,定期更新数据,对新增的客户信息进行聚类分析,重新训练模型进行调整。  
    
    
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)
    
    展开全文
  • 航空公司客户流失分析
  • 一般情况下拿到数据进行分析,首先要对数据进行预处理,根据经典的特征工程选取相应的特征向量,前几步一般都是一样的,然后进行模型训练与数据预测,最后进行决策分析。 首先要导入一些机器学习的包,要好好学习...
  • python之航空公司客户价值分析 (二)-附件资源
  • 本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。 R(Recency)指的是最近一次消费时间与截止时间(采集数据)的间隔。 F(Frequency)指顾客在某...
  • 了解航空公司现状与客户价值分析任务描述与分析1.1 前言 信息时代的来临使得企业营销焦点从产品转向了客户,客户关系管理(Customer relationship management ,CRM)成为企业的核心问题。客户关系管理的关键问题是客户...
  • 文档,数据,以及代码应有尽有!解压即可使用,code直接丢到spyder里面,如果不想改路径就想使用,直接解压到桌面上面运行。文档和代码以及数据均是网络上的综合之后,根据本人经验进行修改。
  • 本次利用获取到的航空公司客户数据,结合RFM模型,采用K-Means聚类算法,分类出不同具有客户价值分群,以此学习kmeans算法的实际运用。 实现目标 (1)对原始数据集进行分析,提取我们需要使用的数据 (2)对抽取的...
  • 数据挖掘实战—航空公司客户价值分析

    千次阅读 多人点赞 2021-04-05 16:18:13
    文章目录引言一、数据探索分析(EDA)1.数据质量分析1.1 缺失值分析1.2 异常值分析1.3 重复数据分析2.数据特征分析2.1 描述性统计分析2.2 分布分析2.2.1 客户基本信息分布...本文将使用航空公司客户数据,结合RFM模型,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,687
精华内容 5,474
关键字:

航空客户数据分析