航空公司客户价值分析

  • 项目背景
  • 信息时代的到来注定营销焦点从产品中心转到了用户中心,客户关系管理成为企业的核心问题。
  • 客户关系管理的关键问题则是客户分类,通过分类区分客户价值的有无和高低,针对不同类别的用户制定个性化服务方案,采取不同营销方案,集中营销资源于高价值用户。
  • 对于航空公司而言,建立合理的客户价值评估模型,对客户进行分群,进行分价值处理是必要的。
  • 挖掘目标
  • 借助航空公司数据,进行客户分类。
  • 对不同客户类别进行特征分析,比较不同类别的客户价值。
  • 对不同价值的客户提供个性化服务,制定相应的营销策略。
  • 分析过程
  • 目标是用户价值识别,一般客户价值识别最广泛的模型是三个指标(最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别高价值用户,这就是RFM模型。
  • 这里需要注意,显然使用消费金额是不合理的(一个长距离的普通舱用户和一个短距离的高级舱用户价值显然不一样)。所以采用累积里程M和乘坐舱位对应的折扣系数的平均值C两个指标代替消费金额。
  • 此外,这种会员制的公司一般入会时间也影响价值判断,所以引入客户关系长度L,作为另一指标。
  • 最终这个模型的指标5个分别是客户关系长度L、消费时间间隔R、消费频率F、飞行里程M、折扣系数平均数C。
  • 处理过程
  • 显然,得到了需要的处理指标了,我们就要进行分析,如果使用传统的RFM的属性分箱方法(依据平均值分析),可以识别,但是分类结果群太多,企业不可能花费这么多的针对性营销成本。
  • 所以很明显,这是一个聚类分析的案例,不妨使用K-Means聚类分析。
  • 数据获取
  • 数据给出。
  • 数据探索 - 主要目标发现缺失值和异常值(如票价为0,可能原因是兑换或者0折)
  • 数据预处理
  • 数据清洗
  • 显然,通过探索已经得知数据存在异常值、缺失值,但是原始数据量太大,这类异常数据占比太少,直接丢弃即可。
  • 属性规约
  • 显然,原始数据中的数据属性太多了,根据需求指标,删除不相干的或者弱相关或者冗余的属性列。
  • 数据变换
  • 属性构造
  • 构造出不存在的指标
  • L = LOAD_TIME - FFP_DATE
  • R = LAST_TO_END
  • F = FLIGHT_COUNT
  • M = SEG_KM_SUM
  • C = AVG_DISCOUNT
  • 数据标准化
  • 不同属性之间取值范围差距过大,理论上影响程度应该一致。
  • 数据挖掘建模
  • 聚类分群(根据5个指标)
  • 采用K-Means聚类分群
  • 特征分析每个群,进行群组排序(依据价值)
  • 不难看出,基本上每一类都有明显的优势和弱势特征,企业需要做的就是根据这些修改营销方案。
  • 后续处理
  • 根据用户特征区间,分策略进行营销。
  • 补充说明
  • 参考书《Python数据分析与挖掘》

这里只列出建模代码,预处理代码可以查看我的github

# -*- coding: UTF-8 -*-
'''
使用K-Means进行聚类
'''
import pandas as pd
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt


def leida(data, kmodel):
    '''
    画出雷达图
    :return:
    '''
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    labels = data.columns
    print(labels)
    k = 5
    plot_data = kmodel.cluster_centers_
    color = ['b', 'g', 'r', 'c', 'y']
    angles = np.linspace(0, 2*np.pi, k, endpoint=False)
    plot_data = np.concatenate((plot_data, plot_data[:, [0]]), axis=1)
    angles = np.concatenate((angles, [angles[0]]))
    fig = plt.figure()
    # polar参数
    ax = fig.add_subplot(111, polar=True)
    for i in range(len(plot_data)):
        # 画线
        ax.plot(angles, plot_data[i], 'o-', color=color[i], label=u'客户群'+str(i), linewidth=2)
    ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties="SimHei")
    ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
    plt.legend(loc=4)
    plt.show()


if __name__ == '__main__':
    inputfile = './data/data_standard.csv'
    k = 5
    # 读取数据并进行聚类分析
    data = pd.read_csv(inputfile, encoding='utf-8')
    # 调用k-means算法,进行聚类分析
    # n_jobs是并行数,一般等于CPU数较好
    kmodel = KMeans(n_clusters=k, n_jobs=4)
    kmodel.fit(data)
    # 查看聚类中心
    kmodel.cluster_centers_
    # 查看各样本对应的类别
    kmodel.labels_
    leida(data, kmodel)