精华内容
下载资源
问答
  • 航空公司客户流失预测
    千次阅读
    2018-12-20 10:49:38

    实战背景

    如今的营销已经远远不同于过去了,那个一张传单一则广告的时代结束了,这是个大数据的时代。一个时代有一个时代的生存法则,那些没有适应时代的企业,即使曾经是个庞然大物,今天也几乎不见踪影。在航空公司这个特殊的领域,国内竞争还是很严峻的,一个顾客的流失造成的损失是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。

    更多相关内容
  • 数据挖掘 | 航空公司客户流失预测

    千次阅读 2020-06-20 15:43:11
    之前的一篇博客介绍了关于航空公司客户价值分析,今天的这篇博客将对航空公司的客户的流失进行预测。采用的是相同的数据集。 1. 背景 客户流失对企业利润的增长造成的负面影响很大。客户与航空公司之间的关系越长久...

    之前的一篇博客介绍了关于航空公司客户价值分析,今天的这篇博客将对航空公司的客户的流失进行预测。采用的是相同的数据集。

    1. 背景

    客户流失对企业利润的增长造成的负面影响很大。客户与航空公司之间的关系越长久,给公司带来的利润就会越高。所以,流失一个客户比获得一个新客户对公司带来的损失更大,因为要获得新客户需要再销售、市场、广告和人员工资等方面花费很多的成本,并且大多数新客户产生的利润并不如老客户高。

    因此,在国内航空市场竞争日益激烈的背景下,航空公司在客户流失方面应该高度重视。本次项目的目的是根据航空公司的数据对老客户的流失做出预测。

    2. 建模前

    客户流失预测主要针对老客户。这里的老客户的界定是飞行次数大于 6 次。

    2.1 类别标记

    接下来给老客户打标签,将第二年飞行次数与第一年飞行次数相比比例小于50%的标记为流失客户,记为 1;将第二年飞行次数与第一年飞行次数相比比例大于等于50%的标记为非流失客户,记为 0。

    用Python实现的方法如下:

    airline['class'] = airline['L1Y_Flight_Count'] / airline['P1Y_Flight_Count']
    
    def class(x):
        if x >= 0.5: return 0
        else: return 1
            
    airline['class'] = airline['class'].apply(class)
    

    2.2 特征选择

    选择如下变量作为预测的特征:

    FFP_TIER
    AVG_INTERVAL
    avg_discount
    BP_SUM
    WEIGHTED_SEG_KM
    EXCHANGE_COUNT
    Points_Sum
    Point_NotFlight
    Eli_Add_Point_Sum
    FLIGHT_COUNT
    SEG_KM_SUM
    EP_SUM
    ADD_Point_SUM
    

    2.3 数据预处理

    这里的数据预处理主要包括两个:

    • FFP_TIER 进行onehot编码
    train_data = airline.iloc[1:,0:13]
    tmp = np.array(train_data.iloc[:,0:1])
    tmp2 = OneHotEncoder(sparse=False).fit_transform(tmp[:, (0,)])
    X = np.hstack((train_data.iloc[:,1:], tmp2))
    
    • 对数据进行标准化处理

    3. 建模

    对客户流失预测可选择的机器学习方法有很多,本案例采用随机森林进行建模预测。

    3.1 训练集预测集划分

    按照 8 : 2 的比例对数据集进行划分

    train_x, test_x, train_y, test_y = train_test_split(X, y, test_size = 0.2, random_state = 123)
    

    3.2 训练模型

    from sklearn.ensemble import RandomForestClassifier
    clf = RandomForestClassifier()
    clf.fit(train_x, train_y)
    

    3.3 训练结果

    准确率

    acc = clf.score(test_x, test_y)
    print(acc)
    >> 0.769384308306464
    

    混淆矩阵

    from sklearn.metrics import confusion_matrix, precision_recall_curve
    cm = confusion_matrix(test_y, predict_y)
    print(cm)
    # 输出
    [[4831  140]
     [1362  180]]
    

    混淆矩阵可视化
    11
    PR曲线
    22
    特征重要性
    随机森林模型可以对特征的重要性进行排序,得到的结果如下图。
    333

    结论

    从结果来看,客户的流失率预测的准确率并不高。可以通过如下方法来尝试提高预测准备率:

    1. 寻找最佳的超参数,在本案例中并没有对参数进行调整,采用的是默认参数。
    2. 尝试其他不同的模型,常见的表现不错的模型有:Logistic Regression, SVM, xgboost等。
    3. 特征选择,重新选择特征,可以采用加入特征或删除特征的方法来看对结果的贡献。
    展开全文
  • 面对激烈的市场竞争,各个航空公司...利用RFM模型对客户进行分类,对不同的客户类别进行特征分析,比较不同类客户客户价值,同时机器学习算法对可能的流失客户就行预测,为航空公司制定相应的营销策略提供支撑。...

    温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :)

    1. 项目背景

      面对激烈的市场竞争,各个航空公司相继推出了更优惠的营销方式来吸引更多的客户,国内某航空公司面临着常旅游客流失、竞争力下降和航空公司资源未充分利用等经营危机。本项目对某航空公司今年来积累的大量的会员档案信息和其乘坐航班记录,利用RFM模型对客户进行分类,对不同的客户类别进行特征分析,比较不同类客户的客户价值,同时机器学习算法对可能的流失客户就行预测,为航空公司制定相应的营销策略提供支撑。

    2. 功能组成

      基于机器学习的航空公司客户价值分析与流失预测功能主要包括:

    3. 数据读取与预处理

    df = pd.read_csv('./data/国内某航空公司会员数据.csv')
    df = df[df['WORK_COUNTRY'] == 'CN']
    del df['Unnamed: 0']
    print(df.shape)

      对于整个数据集,我们做了以下的清洗行为:

    • 丢弃票价为空的记录
    • 保留票价不为0,或平均折扣率不为0且总飞行公里数大于0的记录
    • 把入会时间2014年2月29日的异常记录改为2014年2月28日
    df = df[df['EXPENSE_SUM_YR_1'].notnull()*df['EXPENSE_SUM_YR_2'].notnull()] #票价非空值才保留
    
    #只保留票价非零的,或者平均折扣率与总飞行公里数同时为0的记录。
    index1 = df['EXPENSE_SUM_YR_1'] != 0
    index2 = df['EXPENSE_SUM_YR_2'] != 0
    index3 = (df['SEG_KM_SUM'] == 0) & (df['avg_discount'] == 0) #该规则是“与”
    df = df[index1 | index2 | index3] #该规则是“或”
    MEMBER_NOFFP_DATEFIRST_FLIGHT_DATEGENDERFFP_TIERWORK_CITYWORK_PROVINCEWORK_COUNTRYageLOAD_TIME...Eli_Add_Point_SumL1Y_ELi_Add_PointsPoints_SumL1Y_Points_SumRation_L1Y_Flight_CountRation_P1Y_Flight_CountRation_P1Y_BPSRation_L1Y_BPSPoint_Chg_NotFlightrunoff_flag
    0‘000000042000-08-10 00:00:002000-10-17 00:00:004广州广东CN45.02008-04-01 00:00:00...273425781082645660.3333330.6666670.7542320.245644130
    1‘000000101999-09-29 00:00:001999-09-29 00:00:005NaN北京CN45.02008-04-01 00:00:00...2285228547420307540.5555560.4444440.3692400.63073850
    2‘000000112003-01-23 00:00:002003-03-07 00:00:004大连辽宁CN41.02008-04-01 00:00:00...00722524520.2500000.7500000.6605310.33933000
    3‘000000122003-01-30 00:00:002005-10-16 00:00:004哈尔滨黑龙江CN47.02008-04-01 00:00:00...0013452107910.6923080.3076920.1978000.80212600
    4‘000000132003-01-30 00:00:002003-08-25 00:00:004上海上海CN42.02008-04-01 00:00:00...00455140740.7000000.3000000.1047890.89499100

    4. 数据探索性可视化分析

    4.1 客户基本信息分析

    入会时间和第一次飞行时间

    plt.figure(figsize=(16, 6))
    sns.countplot(df['FFP_DATE'].dt.year)
    plt.title('Distribution histogram of annual membership', fontsize=16, weight='bold')
    plt.show()
    
    plt.figure(figsize=(16, 6))
    sns.countplot(df['FIRST_FLIGHT_DATE'].dt.year)
    plt.title('First flight time distribution histogram', fontsize=16, weight='bold')
    plt.show()

    性别分布

    会员级别分布

    年龄分布

     

      可以看出,会员的人数在2006年的增幅最大,男性占到了76%,会员的级别集中在4级,年龄集中在30-50岁之间。

    2.2 乘坐航班记录信息分析

      乘机信息是和客户价值关联最密切的信息,其中客户最近一次乘坐公司飞机距观测窗口结束的时长(观测窗口j结束时间2014年4月1日,单位为天),飞行次数,总飞行里程数分别可以对应一个用户的R,F,M的信息。

    积分信息

    对于积分相关的信息,我们主要看的是积分的兑换次数和总累积积分。

      绝大多数的积分主要集中在0-10次以内,表明公司对于积分的玩法似乎并不是很重视,绝大部分的会员都没有兑换积分的意识。而总累积积分的分布和飞行次数和飞行里程的分布比较接近,一定程度上可以用另外2个属性来代替。

     2.3 客户信息的相关性分析

    plt.figure(figsize=(12, 10))
    sns.heatmap(tmp.corr(),vmin=0,vmax=1, annot=True, fmt='.1f')
    plt.title('Correlation analysis of customer information', fontsize=20)
    plt.show()

            可以看出,我们选择最近一次乘坐公司飞机距观测窗口结束的时长,飞行次数,总飞行里程数,积分的兑换次数,总累积积分,入会年份和客户年龄进行不同特征间的相关性分析,其中主要用的是皮尔逊相关系数。

    3. RFM 模型建模分析 

      识别客户价值应用最广泛的模型是通过3个指标:

    • 最近消费时间间隔Recency
    • 消费频率Frequency
    • 消费金额Monetary

      来进行客户细分,识别高价值的客户,简称RFM模型

      在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和。由于航空价受到运输距离、航位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。所以消费金额这个指标并不适用于航空公司的客户价值分析。我们选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C,两个指标代替消费金额。

      本案例将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M、折扣系数的平均值C五个指标作为航空公司识别客户价值,记为LRFMC模型。

    • L:会员入会时间距观测窗口结束的月数;
    • R:客户最近一次乘坐公司飞机距观测窗口结束的月数
    • F:客户在观测窗口内乘坐公司飞机的次数
    • M:客户在观测窗口内累计的飞行里程
    • C:客户在观测窗口内乘坐舱位所对应的折扣系数的平均值

      原始数据中属性太多,根据航空公司客户价值LRFMC模型,选择与LRFMC指标相关的6个属性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、avg_discount、SEG_KM_SUM、LAST_TO_END。

      1)L=LOAD_TIME-FFP_DATE(需要手动构造)

    会员入会时间距观测窗口结束的月数=观测窗口的结束时间-入会时间【单位:天】

      2)R=LAST_TO_END

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

      3)F=FLIGHT_COUNT 客户在观测窗口内乘坐公司飞机的次数=观测窗口的总飞行次数【单位:月】

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

      5)C=AVG_DISCOUNT

    客户在观测时间内乘坐舱位多对应的折扣系数的平均值=平均折扣率【单位:无】

    特征构建

    L = pd.to_datetime(df["LOAD_TIME"]) - pd.to_datetime(df["LAST_FLIGHT_DATE"])
    data_features = pd.concat([L.dt.days,df[['DAYS_FROM_LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]],axis = 1)
    data_features.columns = ["L","R","F","M","C"]
    data_features = (data_features - data_features.mean(axis = 0))/(data_features.std(axis = 0)) #简洁的语句实现了标准化变换,类似地可以实现任何想要的变换。
    data_features.columns=['Z'+i for i in data_features.columns] #表头重命名。

    客户信息聚类

    from sklearn.cluster import KMeans 
    k = 5
    kmodel = KMeans(n_clusters = k, n_jobs = 4,random_state=123,init="k-means++") #n_jobs是并行数,一般等于CPU数较好
    kmodel.fit(data_features) #训练模型
    cluster_center = pd.DataFrame(kmodel.cluster_centers_,columns=data_features.columns) #查看聚类中心
    cluster_center.index = pd.Series(kmodel.labels_ ).drop_duplicates().values
    cluster_count = pd.Series(kmodel.labels_ ).value_counts()
    cluster_count.name = "count"
    cluster_center = pd.concat([cluster_center,cluster_count],axis=1)
    cluster_center.index = ["客户群"+str(i + 1) for i in cluster_center.index]
    cluster_center.sort_index(inplace=True)
    cluster_center

     

    plt.subplots(figsize = (10,8))
    sns.heatmap(cluster_center,cmap="Blues",annot=True,vmax=1,square=True)
    plt.show()

     

    针对聚类结果进行特征分析,其中

    • 客户群1,数量最少,所乘航班折扣率较高(一般所乘航班的等级较高),属于重要发展客户。
    • 客户群2,数量较多,乘坐次数很少,累计总飞行公里数较少,很久没有乘坐飞机,属于低价值客户。
    • 客户群3,累计总飞行公里数较大,飞行次数较多,最近乘坐过飞机,属于重要保持客户。
    • 客户群4,数量较多,所乘航班折扣率较低,加入会员时间短,这类客户一般在打折时才会乘坐航班,属于一般客户.
    • 客户群5,数量较多,加入会员时间长,但是最近乘坐频率变小,属于重要挽留客户。

    其中重要发展客户、重要保持客户、重要挽留客户分别对应客户生命周期管理的发展期、稳定期、衰退期。

    客户群排名排名含义
    客户群31重要保持客户
    客户群12重要发展客户
    客户群53重要挽留客户
    客户群44一般客户
    客户群25低价值客户

    聚类参数调优

    distortions =[]
    for i in range(1,11):
        km = KMeans(n_clusters=i,n_init=10,max_iter=300,random_state=0)
        km.fit(data_features)
        distortions.append(km.inertia_)
    
    plt.figure(figsize=(10, 5))
    plt.plot(range(1,11),distortions,marker = "o")
    plt.xlabel("Number of clusters")
    plt.ylabel("Distortion")
    plt.show()

     

    4. 基于决策树的航空客户流失预测建模

    数据集预处理和训练集划分

    # 去除无用的字段
    df.drop(['MEMBER_NO', 'FFP_DATE', 'FIRST_FLIGHT_DATE', 'GENDER', 'WORK_CITY', 'WORK_PROVINCE', 'WORK_COUNTRY',
                 'LOAD_TIME', 'LAST_FLIGHT_DATE', 'TRANSACTION_DATE'], inplace=True, axis=1)
    
    X_train, X_valid, y_train, y_valid = train_test_split(df, y_train_all, test_size=0.1, random_state=42)
    X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.1, random_state=42)
    
    print('train: {}, valid: {}, test: {}'.format(X_train.shape[0], X_valid.shape[0], X_test.shape[0]))
    

    xgboost客户流失模型训练 

    df_columns = X_train.columns.values
    print('===> feature count: {}'.format(len(df_columns)))
    
    xgb_params = {
        'eta': 0.1,
        'min_child_weight': 8,
        'colsample_bytree': 0.5,
        'max_depth': 4,
        'subsample': 0.9,
        'lambda': 2.0,
        'eval_metric': 'auc',
        'objective': 'binary:logistic',
        'nthread': -1,
        'silent': 1,
        'booster': 'gbtree'
    }
    
    dtrain = xgb.DMatrix(X_train, y_train, feature_names=df_columns)
    dvalid = xgb.DMatrix(X_valid, y_valid, feature_names=df_columns)
    
    watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
    
    model = xgb.train(dict(xgb_params),
                          dtrain,
                          evals=watchlist,
                          verbose_eval=100,
                          early_stopping_rounds=100,
                          num_boost_round=4000)

    [0]    train-auc:0.933052    valid-auc:0.928962
    Multiple eval metrics have been passed: 'valid-auc' will be used for early stopping.

    Will train until valid-auc hasn't improved in 100 rounds.
    [100]    train-auc:0.999909    valid-auc:0.999776
    [200]    train-auc:0.999992    valid-auc:0.999906
    [300]    train-auc:0.999999    valid-auc:0.999928
    [400]    train-auc:1    valid-auc:0.999936
    [500]    train-auc:1    valid-auc:0.999935
    Stopping. Best iteration:
    [432]    train-auc:1    valid-auc:0.999937

    客户流失预测模型评估

    # predict train
    predict_train = model.predict(dtrain)
    train_auc = evaluate_score(predict_train, y_train)
    
    # predict validate
    predict_valid = model.predict(dvalid)
    valid_auc = evaluate_score(predict_valid, y_valid)
    
    print('train auc = {:.7f} , valid auc = {:.7f}\n'.format(train_auc, valid_auc))
    
    # predict test
    dtest = xgb.DMatrix(X_test, feature_names=df_columns)
    
    predict_test = model.predict(dtest)
    test_auc = evaluate_score(predict_test, y_test)
    
    print('测试集预测 AUC :', test_auc)
    

    train auc = 1.0000000 , valid auc = 0.9999326
    测试集预测 AUC : 0.9999223269358186

    特征重要程度情况

     ROC 曲线

    fpr, tpr, _ = roc_curve(y_valid, predict_valid)
    roc_auc = auc(fpr, tpr)
    
    plt.figure(figsize=(10,10))
    plt.plot(fpr, tpr, color='darkorange',
             lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([-0.02, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC curve')
    plt.legend(loc="lower right")
    plt.show()

     

    混淆矩阵计算 

    from sklearn.metrics import confusion_matrix
    import itertools
    
    confusion_matrix_test = confusion_matrix(
        y_test, predict_test > 0.5, labels=None, sample_weight=None)

     

    5. 结论

      面对激烈的市场竞争,各个航空公司相继推出了更优惠的营销方式来吸引更多的客户,国内某航空公司面临着常旅游客流失、竞争力下降和航空公司资源未充分利用等经营危机。本项目对某航空公司今年来积累的大量的会员档案信息和其乘坐航班记录,利用RFM模型对客户进行分类,对不同的客户类别进行特征分析,比较不同类客户的客户价值,同时机器学习算法对可能的流失客户就行预测,为航空公司制定相应的营销策略提供支撑。

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。

    技术交流认准下方 CSDN 官方提供的学长 QQ 名片 :)

    精彩专栏推荐订阅:

    Python 毕设精品实战案例

    展开全文
  • 数据挖掘-Python-航空公司客户流失分析决策树模型分类预测.zip,data,data_changed.csv,data_changed2.csv,air_data.csv,data.xls,data_standard.csv,data_cleaned.csv,data_explored.csv,air_data.csv,code,__...
  • 航空公司客户流失分析

    千次阅读 2019-07-27 09:47:01
    本文是接着航空公司客户价值分析,这是拓展思考的部分,这里简单的将它做了一下。在客户管理中,客户流失也是一个十分重要的问题。客户流失对利润增长造成的负面影响非常大,客户与航空公司之间的关系越长久,给航空...

    背景与分析方法

    本文是接着航空公司客户价值分析,这是拓展思考的部分,这里简单的将它做了一下。在客户管理中,客户流失也是一个十分重要的问题。客户流失对利润增长造成的负面影响非常大,客户与航空公司之间的关系越长久,给航空公司带来的利润就回越高。所以流失一个客户,比获得一个新客户对公司的损失更大。
    客户流失分析针对老客户进行分析预测,这里的老客户定义为飞行次数大于6次的客户。用航空公司客户信息数据来进行分类模型训练,预测未来客户的类别归属:未流失、准流失或已流失。

    特征选择

    这里直接采用之前清洗好的数据集来进行特征选择,这里选择的关键属性有:会员卡级别、客户类型、平均乘机时间间隔、平均折扣率、积分兑换次数、非乘机积分总和、单位里程票价以及单位里程积分等。其中客户类型需要进行筛选定义,单位里程票价和单位里程积分需要进行计算。
    选择代码如下:

    import pandas as pd
    #读数据
    input_file = '../data/cleaned.xls'
    output_file = '../tmp/selected.xls'
    data = pd.read_excel(input_file)
    #选取特征
    data['单位里程票价'] = (data['SUM_YR_1'] + data['SUM_YR_2'])/data['SEG_KM_SUM']
    data['单位里程积分'] = (data['P1Y_BP_SUM'] + data['L1Y_BP_SUM'])/data['SEG_KM_SUM']
    data['飞行次数比例'] = data['L1Y_Flight_Count'] / data['P1Y_Flight_Count'] #第二年飞行次数与第一年飞行次数的比例
    #筛选出老客户(飞行次数大于6次的为老客户)
    data = data[data['FLIGHT_COUNT'] > 6]
    #选择特征
    data = data[['FFP_TIER','飞行次数比例','AVG_INTERVAL',
                 'avg_discount','EXCHANGE_COUNT','Eli_Add_Point_Sum','单位里程票价','单位里程积分']]
    #导出
    data.to_excel(output_file,index=None)
    

    然后进行客户类别的定义添加,代码如下:

    import pandas as pd
    input_file = '../tmp/selected.xls'
    output_file = '../tmp/classfication.xls'
    data = pd.read_excel(input_file)
    data['客户类型'] = None
    for i in range(len(data)):
        #第一、二年飞行次数比例小于50%的客户定义为已流失
        if data['飞行次数比例'][i] < 0.5:
            data['客户类型'][i] = 0 #0代表已流失
        #第一、二年飞行次数比例在[0.5,0.9)之间的客户定义为准流失
        if (data['飞行次数比例'][i] >= 0.5) & (data['飞行次数比例'][i] < 0.9) :
            data['客户类型'][i] = 1 #1代表准流失
        #第一、二年飞行次数比例大于等于90%的客户定义为未流失
        if data['飞行次数比例'][i] >= 0.9:
            data['客户类型'][i] = 2 #2代表未流失
    #导出
    data.to_excel(output_file,index=None)
    

    到这里基本上将可以用来训练的数据集准备好了,但是还需要一定的处理。

    标准化处理

    查看之前选择完的数据集,如下图所示,发现其跨度还是比较大,需要进行标准化处理。
    在这里插入图片描述
    处理的代码如下:

    import pandas as pd
    #读数
    input_file = '../tmp/classfication.xls'
    output_file = '../tmp/std.xls'
    data = pd.read_excel(input_file)
    #去掉飞行次数比例
    data = data[['FFP_TIER','AVG_INTERVAL','avg_discount','EXCHANGE_COUNT',
                 'Eli_Add_Point_Sum','单位里程票价','单位里程积分','客户类型']]
    #标准化
    data.loc[:,:'单位里程积分'] = (data.loc[:,:'单位里程积分'] - data.loc[:,:'单位里程积分'].mean(axis = 0)) \
           / (data.loc[:,:'单位里程积分'].std(axis = 0))
    #导出
    data.to_excel(output_file,index=None)
    

    到这里就把能用来进行模型训练的数据集准备好了,下面就需要进行模型的选择以及模型参数的选择了。

    模型选择

    在本文中主要对两个算法进行了测试,分别是决策树以及SVM算法。采用了交叉验证的方法,来测试哪个模型表现得好,主要代码如下所示:

    import pandas as pd
    from sklearn.model_selection import cross_val_score
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.svm import SVC
    input_file = '../tmp/std.xls'
    data = pd.read_excel(input_file)
    #划分X,y
    X = data.loc[:,:'单位里程积分'].values
    y = data.loc[:,'客户类型'].values
    #模型选择使用交叉验证法来评估模型
    model1 = DecisionTreeClassifier()
    model2 = SVC(kernel='rbf')
    score1 = cross_val_score(model1,X,y,cv=5)
    score2 = cross_val_score(model2,X,y,cv=5)
    print('决策树模型得分:{:.2f}'.format(score1.mean()))
    print('SVM模型得分:{:.2f}'.format(score2.mean()))
    
    

    结果如下图所示:
    在这里插入图片描述
    可以看到在还没有对SVM进行参数选择优化的时候,SVM得分已经远远超过了决策树,所以在本次流失分析中,初步选择SVM模型进行此次的分类模型训练。

    模型参数选择

    在这里使用网格搜索法来选取SVM的最优参数,即确定C、gamma的值,代码如下:

    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import SVC
    import joblib
    #读取数据
    input_file = '../tmp/std.xls'
    output_file = '../tmp/loss.pkl'
    data = pd.read_excel(input_file)
    #划分训练集、测试集
    X = data.loc[:,:'单位里程积分'].values
    y = data.loc[:,'客户类型'].values
    X_train,X_test,y_train,y_test =  train_test_split(X,y,train_size = 0.8)
    #采用网格搜索法来寻找SVC的最优参数
    svc = SVC(kernel='rbf')
    params = {'gamma':[0.1,1.0,10.0],
              'C':[1.0,10.0,100.0]}
    grid_search = GridSearchCV(svc,params,cv=5)
    grid_search.fit(X_train,y_train)
    print('模型最高分 {:.2f}'.format(grid_search.score(X_test,y_test)))
    print('最优参数为: {}'.format(grid_search.best_params_))
    
    

    执行结果如下:
    在这里插入图片描述
    可以看到模型得分并不是很高,最佳参数也出来了,暂且就这样用用吧,接下来用最佳参数来训练模型并保存。

    svc = SVC(kernel='rbf',C=1.0,gamma=1.0)
    svc.fit(X_train,y_train)
    joblib.dump(svc,output_file)
    

    这样就将模型保存好了,后面再用模型来进行预测。

    模型预测

    这里就只用测试集的一组数据进行测试了,看是否预测分类正确,代码如下:

    import joblib
    from model import X_test,y_test
    #导入模型
    model = joblib.load('../tmp/loss.pkl')
    #预测分类
    y_predict = model.predict([X_test[0]])
    print(y_predict)
    print(y_test[0])
    

    运行结果如下所示:
    在这里插入图片描述
    如上图所示,这一组预测是正确的,预测的结果是2代表未流失,实际结果也是未流失,说明预测正确,虽然这次的模型得分不高但主要是用来练一下手,有兴趣的可以下来看采用什么办法来提高模型得分。

    展开全文
  • SASchampion2017描述基于航空公司的数据,构建了进行损失预警的模型,包括损失概率模型和客户画像。矿业 以数据预处理(DataPreprocessing)后的58,954条航空客户数据为例,通过数据挖掘中的分类和聚类技术分别进行...
  • 随机森林:客户流失预测

    万次阅读 2018-03-19 01:00:58
    本文主要对客户流失进行分类预测。1 背景与挖掘目标1.1 背景1、客户流失对利润增长造成的负面影响非常大,仅次于公司规模、市场占有率、单位成本等因素的影响;2、流失一个老客户比获得一个新客户对公司的损失更大;...
  • 航空公司客户价值分析完整版

    千次阅读 2021-07-15 19:15:02
    航空公司客户价值分析 +++ 1、了解航空公司现状与客户价值分析 1、行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩...
  • 1:对航空公司的数据分析去掉无关特征,去掉有误的数据(例如:一年票价为0,第二年票价也是0) 2:根据LCRFM模型选取有关特征,对特征数据进行标准化 3:使用k-means算法模型对特征聚类分析,比较不同类客户的...
  • 数据挖掘 | 航空公司客户价值分析

    千次阅读 2020-06-18 11:30:23
    研究生期间读了一些关于客户生命周期价值(customer lifetime value,CLV)的一些文章,对此颇感兴趣,正好最近看到一个关于航空公司客户价值分析的案例,写一篇博客记录一下。 1. 数据挖掘的目标 相对激烈的市场...
  • 在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提示企业竞争力,为企业带来更多的利益。 2.传统方法存在的缺陷 广泛用于分析客户...
  • Machine Learning ——客户流失率的预测

    千次阅读 热门讨论 2018-09-06 10:40:53
    对于具有订购模式(如手机,有线电视或商家信用卡)的企业来说,预测客户流失尤为重要。但建模流失在许多领域都有广泛的应用。例如,赌场已经使用预测模型来预测理想的房间条件,以便将顾客留在二十一点牌桌上以及...
  • 基于聚类算法完成航空公司客户价值分析任务1、任务描述2、数据集2.1 数据集中字段含义3、方法3.1 数据预处理3.2 特征工程3.2.1 RFM模型3.2.2 变体-LRFMC模型3.2.3 标准化3.3 模型训练与对数据的预测3.3.1 KMeans聚类...
  • 客户流失预警分析

    千次阅读 2019-06-26 20:41:43
    航空客户流失预警分析 一.数据理解 1.商业背景 在国内航空行业竞争日益激烈的情形下,获得一个新客户所付出的成本远远大于挽留一个老客户,因为获得一个新客户需要在宣传、项目、建立客户资料及维持客户关系方面...
  • 文章目录背景和目标数据客户基本信息乘机信息积分信息脚本data_explore.pydata_clean.pyzscore_data.pyKMeans_cluster.pycluster_plot.py分析方法和过程方法流程模型解释模型应用拓展 背景和目标 通过客户分类,...
  • K-means算法分析航空公司客户价值

    千次阅读 多人点赞 2019-03-22 10:15:18
    信息时代的来临使得企业营销焦点从产品转向了客户客户关系管理(Customerrelationship management,CRM)成为企业的核心问题。客户关系管理的关键问题是客户分群。通过客户分群,区分无价值客户和高价值客户。企业...
  • 客户流失/流失,是企业最重要的指标之一,因为获取新客户的成本通常高于保留现有客户的成本。 事实上,根据一个贝恩公司研究,随着时间的推移,现有客户倾向于从公司购买更多产品,从而降低企业的运营成本,并可能...
  • 航空公司客户价值分析一、背景与挖掘目标  客户关系管理是企业的核心问题,关键在于客户的分类:区别无价值客户,高价值客户,针对不同客户群体有的放矢投放具体服务方案,实现企业利润最大化的目标。 各大航空...
  • 本数据集可以用于对航空公司客户进行当前、潜在价值分析,特征分析,乘坐预测,剖析生命周期。 本数据集共有6+w的数据,每位乘客为一个样本,包含该乘客的63个属性,属性包括乘客的基本信息--工作地域、年龄、...
  • 但是企业在不惜代价发展新用户的过程中,往往会忽视或无暇顾及已有客户流失情况,结果就导致出现这样一种窘况:一边是新客户在源源不断地增加,而另一方面是辛辛苦苦找来的客户却在悄然无声地流失。因此对老用户的...
  • 2.2.1. 航空公司客户细分参数的确定 2.2.2. 航空公司客户细分的具体步骤 2.2.3. 结果分析 结论 参考文献 1. 挖掘目标 市场竞争异常激烈的今天,如何识别有价值的客户是企业营销策略的一个非常重要的环节。我们希望...
  • 从2001年初开始,包括KLM在内很多航空公司均面临需求疲软和不可预测的问题,还有来自低成本竞争的巨大压力。KLM为此推行了一个广泛的成本消减规划。但是KLM意识到单单减少成本不能确保长期公司长期健康发展。整个...
  • 航空客运信息挖掘

    千次阅读 2020-10-03 22:38:50
    本例就是期望从航空公司感兴趣的主题,例如流失预测客户细分和客户价值评估等方面,通过数据挖掘技术,实现提升航空客运的上座率目标。 附件数据集来自国内某航空公司的会员数据,共有62988个样本,每个样本有63个...
  • # 电信客户流失率数据 churn <- read_rds(chuata.rds)) 数据 花点时间探索下面的这个数据集。 此数据框中的一行代表一家电信公司的客户。每个客户都从该公司购买了电话和互联网服务。 此数据中的因变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 499
精华内容 199
热门标签
关键字:

航空公司客户流失预测