数据分析与挖掘实战-航空公司客户流失分析

实战背景

如今的营销已经远远不同于过去了,那个一张传单一则广告的时代结束了,这是个大数据的时代。一个时代有一个时代的生存法则,那些没有适应时代的企业,即使曾经是个庞然大物,今天也几乎不见踪影。在航空公司这个特殊的领域,国内竞争还是很严峻的,一个顾客的流失造成的损失是4-5个新顾客的流入所不能弥补的,分析用户(特别是会员用户)相关信息,建立模型,发现流失用户特征,制定针对性营销策略,挽留用户是企业生存的重要一环。本项目基于大数据样本进行挖掘建模,根据用户特征建立模型发现用户流失特征及其原因分析。

实战分析

其实,作为航空公司,客户流失是不可避免的,因为有些用户乘机频率非常低,这部分用户是偶然用户,他们的流失没有太大的挽留价值。再者,那些会员用户才是研究的重点,愿意入会的,一定是有频繁乘机体验的,这部分人要么是商务精英要么是比较富裕的人,这几类人都是颇具头脑的。但是,即使这样还是流失了,那就是航空公司给出的服务问题了,这类人是重点研究对象。

当前,有一个比较尴尬的问题,什么样的顾客可以定义为流失呢?样本数据中根本没有这一项。我们不妨这样定义:

客户类型定义方式
已流失客户第二年飞行次数与第一年飞行次数比例小于50%
准流失客户第二年飞行次数与第一年飞行次数比例在[50%,90%)内
未流失客户第二年飞行次数与第一年飞行次数比例大于90%

通过上面的定义,解决了这个问题,以一种相对合理的方式定义了用户类型。

当然,实际处理时还需要选取客户的关键属性建立模型,如会员卡级别、客户类型(如上定义)、平均乘机时间间隔、平均折扣率、积分兑换次数、非乘机积分总和、单位里程票价和单位里程积分等。任然采用常用的8:2进行训练测试样本分布。

数据获取

数据给出(特征过多)

数据探索

首先声明,表头均没有使用中文,均为航空公司报表专业术语观测窗口使用两年(06年4月到08年3月),请了解后再阅读本博客,这里不做赘述了。

经过初步的数据探索,我得到了一个分析表,记录数目,各列的平均值、四分位数、标准差、极值等;

为数据预处理定下了基本的基调,首先,有几列数据几乎所有记录都为0,这是没有意义的。(在数据挖掘领域中没有对比的数据是没有任何意义的,因为所有数据都是为了建模服务的)

数据预处理

在数据预处理的第一步就出现了一个不算问题的问题,就是由于Excel解析csv以及编码的一些问题,我看到的表格是错位的,我数据处理第一步就直接数据流导出去成为一个新的xls文件,对于xls文件Excel的解析没有问题,现在,最基本的,我们可视化判断没有了阻碍。(保留最开始的数据是数据分析的基本原则之一)

然后,发现第一列用户编号是用户的唯一标识,然而这对于建模是没有意义的,必须剔除第一列。选取合适属性构造了需要的六个属性LRFMCK模型,并进行标准化数据。

数据挖掘建模

流失用户的分析,并且判断用户会不会流失,这是一个分类问题,我们使用决策树建模。

具体代码如下。

# -*- coding:UTF-8 -*-
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
import pydotplus
from sklearn.externals.six import StringIO


def getDataSet(fileName):
    # 读取数据
    data = pd.read_csv(fileName)
    dataSet = []
    for item in data.values:
        dataSet.append(list(item[:5]))
    label = list(data['K'])
    return dataSet, label


def divide(dataSet, labels):
    '''
    分类数据,按比例拆开
    :param dataSet:
    :param labels:
    :return:
    '''
    train_data, test_data, train_label, test_label = train_test_split(dataSet, labels, test_size=0.2)
    return train_data, test_data, train_label, test_label


if __name__ == '__main__':
    data, label = getDataSet('./data/data_standard.csv')
    train_data, test_data, train_label, test_label = divide(data, label)
    clf = tree.DecisionTreeClassifier(max_depth=5)
    clf = clf.fit(train_data, train_label)
    # 可视化
    dataLabels = ['ZL', 'ZR', 'ZF', 'ZM', 'ZC', ]
    data_list = []
    data_dict = {}
    for each_label in dataLabels:
        for each in data:
            data_list.append(each[dataLabels.index(each_label)])
        data_dict[each_label] = data_list
        data_list = []
    lenses_pd = pd.DataFrame(data_dict)
    print(lenses_pd.keys())
    dot_data = StringIO()
    tree.export_graphviz(clf, out_file=dot_data, feature_names=lenses_pd.keys(),
                         class_names=clf.classes_, filled=True, rounded=True, special_characters=True)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    graph.write_pdf("tree.pdf")
    from cm_plot import *
    cm_plot(test_label, clf.predict(test_data)).show()

后续处理

通过分类预测现有用户是否流失倾向是无比重要的,发现流失可能性进行相应营销比较必要,这里决策树预测准确率还算可以,在深度合适(发现4-5)预测准确率达到85%左右,对于营销需求是达到了。

补充说明

本文参考书为《Python数据分析与挖掘》,本案例使用决策树建模,具体数据集和其他代码可以查看我的Github,欢迎star或者fork。

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周先森爱吃素

你的鼓励是我坚持创作的不懈动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值