精华内容
下载资源
问答
  • python客户价值分析
    千次阅读
    2021-07-13 20:46:03

    航空公司客户价值分析

    项目分析过程如下:

    1、了解航空公司现状与客户价值分析

    一、航空公司现状:

    (1)行业内竞争:

    ​ 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争。

    (2)行业外竞争:

    ​ 随着高铁、动车等铁路运输的兴建,航空公司受到巨大冲击。

    二、客户价值分析

    (1)航空公司的数据分析:

    ​ 目前航空公司已积累了大量的会员档案信息和其乘坐航班记录。以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据,44个特征,总共62988条记录。数据如air_data.csv所示!

    (2)航空公司的营销实施经验分析:

    ​ 1、公司收入的80%来自顶端的20%的客户。

    ​ 2、20%的客户其利润率100%。

    ​ 3、90%以上的收入来自现有客户。

    ​ 4、大部分的营销预算经常被用在非现有客户上。

    ​ 5、5%至30%的客户在客户金字塔中具有升级潜力。

    ​ 6、客户金字塔中客户升级2%,意味着销售收入增加10%,利润增加50%。

    注意:这些经验也许并不完全准确,但是它揭示了新时代客户分化的趋势,也说明了对客户价值分析的迫切性和必要性。

    2、预处理航空客户数据

    (1)通过观察,航空公司客户原始数据存在少量的缺失值和异常值,需要清洗后才能用于分析。具体表现在:

    ​ 1、通过对数据观察发现原始数据中存在票价为空值,票价最小值为0,折扣率最小值为0,总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成。

    ​ 处理方法:丢弃票价为空的记录。

    #首先,导入项目所需要的库
    import pandas as pd #pandas库用于文件操作
    from sklearn.preprocessing import StandardScaler #用于对数据的标准化
    import matplotlib.pyplot as plt #用于绘制图像可视化
    import numpy as np #用于对数据的运算
    from sklearn.cluster import KMeans  #sklearn封装的KMeans算法库
    
    def load_data():
        """
        加载数据
        :return: air_data
        """
        air_data = pd.read_csv('../dates/air_data.csv', encoding='ansi')
    
        return air_data
    
     #丢弃票价为空的记录。
     msk1 = pd.notnull(air_data['SUM_YR_1'])  # 如果有值,则为True,如果为空,则为False
     msk2 = pd.notnull(air_data['SUM_YR_2'])  # 如果有值,则为True,如果为空,则为False
    
     # 都为True ---置为True   只要有一个False --->False
     msk = msk1 & msk2
    
     # 筛选数据
    airline_notnull = air_data.loc[msk,:]
    print('删除缺失记录后数据的形状为:',airline_notnull.shape)
    

    ​ 2、其他的数据可能是客户乘坐0折机票或者积分兑换造成。由于原始数据量大,这类数据所占比例较小,对于问题影响不大,因此对其进行丢弃处理。

    ​ 处理方法:丢弃票价为0,平均折扣率不为0,总飞行公里数大于0的记录。

    #只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
    # b、丢弃票价为 0、平均折扣率不为 0、总飞行千米数大于 0 的记录。
    # --保留对航空公司有价值的数据: 票价 > 0 ,同时折扣 > 0 同时  飞行里程 > 0
    msk3 = air_data['SUM_YR_1'] > 0
    msk4 = air_data['SUM_YR_2'] > 0
    # 2种思考方式: 两个票价必须都大于0,票价才大于0 ; 只要有一个票价大于0 ,那么票价就大于0
    
    # 折扣大于0
    msk5 = air_data['avg_discount'] > 0
    
    # 飞行里程 > 0
    msk6 = air_data['SEG_KM_SUM'] > 0
    msk = (msk3 | msk4) & msk5 & msk6
    # 筛选数据
    air_data = air_data.loc[msk, :]
    print('删除异常记录后数据的形状为:',air_data.shape)
    

    (2)构建航空客户价值分析的关键特征

    1、RFM模型介绍:

    ​ 本项目的目标是客户价值分析,即通过航空公司客户数据识别不同价值的客户,识别客户价值应用最广泛的模型是RFM模型。

    ​ 一、R(Recency)指的是最近一次消费时间与截止时间的间隔。通常情况下,最近一次消费时间与截止时间的间隔越短,对即时提供的商品或是服务也最有可能感兴趣。

    ​ 二、F(Frequency)指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客,也是满意度越高的顾客,其忠诚度也就越高,顾客价值也就越大。

    ​ 三、M(Monetary)指顾客在某段时间内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓“20%的顾客贡献了80%的销售额”的二八法则。

    2、RFM模型结果解读:

    在这里插入图片描述

    ​ RFM模型包括三个特征,使用三维坐标系进行展示,如图所示。X轴表示Recency,Y轴表示Frequency,Z轴表示Monetary,每个轴一般会分成5级表示程度,1为最小,5为最大。

    3、航空客户价值分析的LRFMC模型:

    ​ 本项目选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个特征代替消费金额。此外,航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一特征。

    ​ 本项目将客户关系长度L,消费时间间隔R,消费频率F,飞行里程M和折扣系数的平均值C作为航空公司识别客户价值的关键特征(如图所示),记为LRFMC模型。

    在这里插入图片描述

    
    # 选取需求特征
    airline_selection = air_data[["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('构建的LRFMC特征前5行为:\n',airline_features.head())
    
    
    # 标准化后LRFMC五个特征
    from sklearn.preprocessing import StandardScaler
    data = StandardScaler().fit_transform(airline_features)
    np.savez('../dates/airline_scale.npz',data) #保存处理好的数据
    print('标准化后LRFMC五个特征为:\n',data[:5,:])
    

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

    airline_scale = np.load('../dates/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)   #模型训练
    centers = kmeans_model.cluster_centers_ 
    print("聚类中心",centers)#查看聚类中心
    
    print(kmeans_model.labels_) #查看样本的类别标签
    
    #统计不同类别样本的数目
    r1 = pd.Series(kmeans_model.labels_).value_counts()
    print('最终每个类别的数目为:\n',r1)
    
    

    4、数据可视化(利用雷达图,从不同的特征来描述数据对象)

    def show_res(centers):
        """
        绘制雷达图,来展示结果
        :param centers: 各个类别的聚类中心
        :return: None
        """
        # 1、创建画布
        plt.figure()
    
        # 支持中文,支持负号:
        plt.rcParams['font.sans-serif'] = 'SimHei'
        plt.rcParams['axes.unicode_minus'] = False
    
        # 2、绘图及修饰
        # 绘制雷达图
        datalength = centers.shape[1]
        # 构建角度----从0-2π生成5个元素的等差数组
        angle = np.linspace(0, 2 * np.pi, datalength, endpoint=False)
        # 闭合角度
        angle = np.concatenate((angle, [angle[0]]), axis=0)
        print('angle:\n', angle)
    
        # 闭合数据
        centers = np.concatenate((centers, centers[:, 0:1]), axis=1)
    
        # 绘制雷达图
        for i in range(centers.shape[0]):
            plt.polar(angle, centers[i, :])
    
        # 添加标题
        plt.title('航空公司客户聚类结果')
    
        # 修改刻度
        plt.xticks(angle[:-1], ['L', 'R', 'F', 'M', 'C'])
    
        # 添加图例
        plt.legend(['第一类客户', '第二类客户', '第三类客户', '第四类客户', '第五类客户'], loc=0)
    
        # 保存
        # plt.savefig('./data/航空公司客户聚类结果.png')
        # 3、保存及展示
        plt.show()
    
    #数据可视化
    show_res(centers)
    

    在这里插入图片描述

    预测结果所示:

    最终每个类别的数目为:
    4    24611
    0    15730
    3    12111
    1     5337
    2     4255
    

    5、完整代码

    # -*- codeing = utf-8 -*-
    # @Project :中共教育实训
    # @Date :2021/7/13,18:59
    # @Author :田智龙
    # @File :答辩航空公司分析项目
    # @Software:中共教育实训
    # -*- coding: utf-8 -*-
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.cluster import KMeans
    
    def load_data():
        """
        加载数据
        :return: air_data
        """
        air_data = pd.read_csv('../dates/air_data.csv', encoding='ansi')
        return air_data
    
    def dell_data(air_data):
        # 丢弃票价为空的记录。
        msk1 = pd.notnull(air_data['SUM_YR_1'])  # 如果有值,则为True,如果为空,则为False
        msk2 = pd.notnull(air_data['SUM_YR_2'])  # 如果有值,则为True,如果为空,则为False
    
        # 都为True ---置为True   只要有一个False --->False
        msk = msk1 & msk2
    
        # 筛选数据
    
    
        airline_notnull = air_data.loc[msk, :]
        print('删除缺失记录后数据的形状为:', airline_notnull.shape)
        # 只保留票价非零的,或者平均折扣率不为0且总飞行公里数大于0的记录。
        # b、丢弃票价为 0、平均折扣率不为 0、总飞行千米数大于 0 的记录。
        # --保留对航空公司有价值的数据: 票价 > 0 ,同时折扣 > 0 同时  飞行里程 > 0
        msk3 = air_data['SUM_YR_1'] > 0
        msk4 = air_data['SUM_YR_2'] > 0
        # 2种思考方式: 两个票价必须都大于0,票价才大于0 ; 只要有一个票价大于0 ,那么票价就大于0
    
        # 折扣大于0
        msk5 = air_data['avg_discount'] > 0
    
        # 飞行里程 > 0
        msk6 = air_data['SEG_KM_SUM'] > 0
        msk = (msk3 | msk4) & msk5 & msk6
        # 筛选数据
        air_data = air_data.loc[msk, :]
        print('删除异常记录后数据的形状为:', air_data.shape)
    
        # 选取需求特征
        airline_selection = air_data[["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('构建的LRFMC特征前5行为:\n', airline_features.head())
    
        # 标准化后LRFMC五个特征
        from sklearn.preprocessing import StandardScaler
        data = StandardScaler().fit_transform(airline_features)
        # np.savez('../dates/airline_scale.npz', data)  # 保存处理好的数据
        print('标准化后LRFMC五个特征为:\n', data[:5, :])
    
        return air_data
    
    def show_res(centers):
        """
        绘制雷达图,来展示结果
        :param centers: 各个类别的聚类中心
        :return: None
        """
        # 1、创建画布
        plt.figure()
    
        # 支持中文,支持负号:
        plt.rcParams['font.sans-serif'] = 'SimHei'
        plt.rcParams['axes.unicode_minus'] = False
    
        # 2、绘图及修饰
        # 绘制雷达图
        datalength = centers.shape[1]
        # 构建角度----从0-2π生成5个元素的等差数组
        angle = np.linspace(0, 2 * np.pi, datalength, endpoint=False)
        # 闭合角度
        angle = np.concatenate((angle, [angle[0]]), axis=0)
        print('angle:\n', angle)
    
        # 闭合数据
        centers = np.concatenate((centers, centers[:, 0:1]), axis=1)
    
        # 绘制雷达图
        for i in range(centers.shape[0]):
            plt.polar(angle, centers[i, :])
    
        # 添加标题
        plt.title('航空公司客户聚类结果')
    
        # 修改刻度
        plt.xticks(angle[:-1], ['L', 'R', 'F', 'M', 'C'])
    
        # 添加图例
        plt.legend(['第一类客户', '第二类客户', '第三类客户', '第四类客户', '第五类客户'], loc=0)
    
        # 保存
        # plt.savefig('./data/航空公司客户聚类结果.png')
        # 3、保存及展示
        plt.show()
    
    def main():
        #加载数据
        air_data = load_data()
        #处理数据
        dell_data(air_data)
        k = 5  ## 确定聚类中心数
        # 构建模型
        kmeans_model = KMeans(n_clusters=k, n_jobs=4, random_state=123)
        fit_kmeans = kmeans_model.fit(air_data)  # 模型训练
        centers = kmeans_model.cluster_centers_
        print("聚类中心", centers)  # 查看聚类中心
    
        print(kmeans_model.labels_)  # 查看样本的类别标签
    
        # 统计不同类别样本的数目
        r1 = pd.Series(kmeans_model.labels_).value_counts()
        print('最终每个类别的数目为:\n', r1)
    
        #数据可视化
        show_res(centers)
    
    if __name__ == '__main__':
        main()
    

    数据air_data.csv:私聊我获得项目中的数据!

    作者:SmartDragon

    QQ邮箱:2455404279@qq.com

    更多相关内容
  • 利用K-means算法对历年航空公司数据进行分析
  • 目标定义 数据获取 数据探索性分析 数据清洗 RFM模型处理

    文章导览

            目标定义

            数据获取

            数据探索性分析

            数据清洗

            RFM模型处理

    一、目标定义

    这里有一个关于欧洲某商家2010年12月-2011年12月的销售数据截取的部分片段。目标是根据RF模型对顾客进行划分。

    二、数据获取

    ​​​​​​​RFM模型训练用 - Heywhale.comhttps://www.heywhale.com/mw/dataset/623f3a0b40f3c80018378be0/file数据集已挂在和鲸社区,链接如上

    三、探索性分析

            3,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  # 解决中文显示的问题
    from warnings import filterwarnings
    filterwarnings('ignore')  # 忽略警告的问题
    import seaborn as sns
    !pip install brewer2mpl  # 解决画图库尴尬的配色问题
    import brewer2mpl
    
    # 导入数据
    data = pd.read_csv("./data_sale.csv")
    data.head(10)

    # 查看基本信息
    data.shape
    data.isnull().sum()
    data.info()
    
    # 输出如下
    (541909, 8)
    
    InvoiceNo           0
    StockCode           0
    Description      1454
    Quantity            0
    InvoiceDate         0
    UnitPrice           0
    CustomerID     135080
    Country             0
    dtype: int64
    
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 541909 entries, 0 to 541908
    Data columns (total 8 columns):
     #   Column       Non-Null Count   Dtype  
    ---  ------       --------------   -----  
     0   InvoiceNo    541909 non-null  object 
     1   StockCode    541909 non-null  object 
     2   Description  540455 non-null  object 
     3   Quantity     541909 non-null  int64  
     4   InvoiceDate  541909 non-null  object 
     5   UnitPrice    541909 non-null  float64
     6   CustomerID   406829 non-null  float64
     7   Country      541909 non-null  object 
    dtypes: float64(2), int64(1), object(5)
    memory usage: 33.1+ MB

    # 数据集共54万1999条数据,8个字段
    # InvoiceNo  发票编号  字符串  无缺
    # StockCode  走势  字符串  无缺
    # Description  描述  字符串 有缺
    # Quantity  数量  数字型  无缺
    # InvoiceDate  发票日期  字符串  无缺
    # UnitPrice  单价  小数型  无缺
    # CustomerID  顾客编号  小数型  有缺
    # Country  国家  字符型  无缺

    观察到Customer_ID一列数据类型是浮点小数,需要转换成字符型

    # 转换类型
    data["InvoiceDate"] = pd.to_datetime(data["InvoiceDate"])
    data["CustomerID"] = data["CustomerID"].astype("object",copy=False)

    四、数据清洗

    ## 数据清洗
    # 去重
    data = data.drop_duplicates()  # duplicates  (n)副本  默认行数据比较取出完全相同的
    data.info()  # 去重后还剩53万+的数据
    
    -------------------------------------
    # 输出
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 536641 entries, 0 to 541908
    Data columns (total 8 columns):
     #   Column       Non-Null Count   Dtype         
    ---  ------       --------------   -----         
     0   InvoiceNo    536641 non-null  object        
     1   StockCode    536641 non-null  object        
     2   Description  535187 non-null  object        
     3   Quantity     536641 non-null  int64         
     4   InvoiceDate  536641 non-null  datetime64[ns]
     5   UnitPrice    536641 non-null  float64       
     6   CustomerID   401604 non-null  object        
     7   Country      536641 non-null  object        
    dtypes: datetime64[ns](1), float64(1), int64(1), object(5)
    memory usage: 36.8+ MB
    --------------------------------------
    # 统计异常值
    data.describe()  # 负值明显是错误的
    
    # 查看负值的情况有多少
    data[data["UnitPrice"]<0]["UnitPrice"].count()
    
    data[data["Quantity"]<0]["Quantity"].count()
    
    
    --------------------------------------------
    # 输出
    	Quantity	UnitPrice
    count	536641.000000	536641.000000
    mean	9.620029	4.632656
    std	219.130156	97.233118
    min	-80995.000000	-11062.060000
    25%	1.000000	1.250000
    50%	3.000000	2.080000
    75%	10.000000	4.130000
    max	80995.000000	38970.000000
    
    2
    
    10587
    --------------------------------------------
    
    # 删除不符合条件的行
    data = data[data['UnitPrice']>=0]  
    data = data[data['Quantity']>=0]
    # 缺失删除的是整行数据,删完后还剩52万6千+的数据
    
    # 统计缺失值有多少
    data.isnull().sum()

    # 统计缺失值的占比
    data.isnull().sum()/data.shape[0]*100  # 顾客ID一栏缺失的比较多

    # 删除CustomerID为空的数据
    data = data[~data["CustomerID"].isnull()]  # 删除某些行时,可以用赋值语句。~代表取反
    data = data.reset_index(drop=True)  # 删除之后还剩39万+行数据

    五、数据分析及RFMM用户价值分析

    ## 数据分析
    # 添加一列sales
    data["sales"] = data["Quantity"] * data["UnitPrice"]
    data

    # 计算购买频率(每个顾客购买次数)
    frequency_data = data.groupby("CustomerID")["InvoiceNo"].count()
    frequency_data = pd.DataFrame(frequency_data)
    
    # 计算每个顾客的购买总金额
    frequency_data["sales"] = data.groupby("CustomerID")["sales"].sum()
    
    # 计算顾客的最近购买行为与最终日期的相隔天数
    frequency_data["dateDiff"] = (pd.to_datetime('2012-01-01') - data.groupby("CustomerID")["InvoiceDate"].max()).dt.days
    data_rfm = frequency_data
    
    # 重命名列
    data_rfm.columns = ["frequency","sales","datediff"]
    data_rfm

     

    ## 数据可视化
    # 查看数据分布
    sns.pairplot(data_rfm)  # pairplot函数查看数据两两之间的关系

    # 绘制数据的直方图
    plt.figure(1,figsize=(12,6))
    n=0
    for x in ['frequency','datediff','sales']:
        n+=1
        plt.subplot(1,3,n)
        plt.subplots_adjust(hspace=0.5,wspace=0.5)
        sns.distplot(data_rfm[x],bins=30)
        plt.title('{} 直方图'.format(x))
    plt.show()

     

    ## RFM模型
    # 计算出划分用户的阈值,通过分布直方图可以发现该份数据不适合用中位数来分层,因此这里用均值做分层
    r_mean = data_rfm["datediff"].mean()
    f_mean = data_rfm["frequency"].mean()
    m_mean = data_rfm["sales"].mean()
    
    # 添加一列数据type
    data_rfm["cus_type"] = np.nan
    data_rfm

     

    # 编写循环填充表格type
    for i in range(len(data_rfm)):
        if data_rfm.iloc[i,0] >= f_mean and data_rfm.iloc[i,1] >= m_mean and data_rfm.iloc[i,2] < r_mean:
            data_rfm.iloc[i,3]="重要价值用户"
        elif data_rfm.iloc[i,0] >= f_mean and data_rfm.iloc[i,1] >= m_mean and data_rfm.iloc[i,2] >= r_mean:
            data_rfm.iloc[i,3]="重要保持用户"
        elif data_rfm.iloc[i,0] < f_mean and data_rfm.iloc[i,1] >= m_mean and data_rfm.iloc[i,2] < r_mean:
            data_rfm.iloc[i,3]="重要发展用户"
        elif data_rfm.iloc[i,0] < f_mean and data_rfm.iloc[i,1] >= m_mean and data_rfm.iloc[i,2] >= r_mean:
            data_rfm.iloc[i,3]="重要挽留用户"
        elif data_rfm.iloc[i,0] >= f_mean and data_rfm.iloc[i,1] < m_mean and data_rfm.iloc[i,2] < r_mean:
            data_rfm.iloc[i,3]="一般价值用户"
        elif data_rfm.iloc[i,0] < f_mean and data_rfm.iloc[i,1] < m_mean and data_rfm.iloc[i,2] < r_mean:
            data_rfm.iloc[i,3]="一般发展用户"
        elif data_rfm.iloc[i,0] >= f_mean and data_rfm.iloc[i,1] < m_mean and data_rfm.iloc[i,2] >= r_mean:
            data_rfm.iloc[i,3]="一般保持用户"
        elif data_rfm.iloc[i,0] < f_mean and data_rfm.iloc[i,1] < m_mean and data_rfm.iloc[i,2] >= r_mean:
            data_rfm.iloc[i,3]="一般挽留用户"
    
    data_rfm

    # 计算个类型用户数量并可视化
    Cus_type = data_rfm.groupby("cus_type")["cus_type"].count().sort_values(ascending=False)
    sns.barplot(Cus_type.index,Cus_type)
    plt.xticks(rotation=30)
    plt.show()

    ​​​​​​​ 

     

    # 计算不同用户的消费总额,可视化其份额比例
    cus_sales = data_rfm.groupby("cus_type")["sales"].sum().sort_values(ascending=False)
    cus_sales
    plt.figure(figsize=(10,10))
    explode01 = np.array([0.05]*8)
    colors01 = brewer2mpl.get_map('Set3', 'qualitative', 8).mpl_colors  # 解决配色问题关键
    plt.pie(cus_sales,labels=cus_sales.index,autopct='%.2f%%',textprops={'fontsize':14,'color':'k'},colors=colors01,explode=explode01)
    plt.title('不同类型的客户销售份额',fontsize=15)
    plt.show()


    展开全文
  • 要实现精细化运营,就需要对用户进行分层,筛选出各层次的用户,这样运营才能针对性的制作策略去运营。我今天就来说下用户分层经典...而RFM模型就是通过这三项指标,来描述客户价值状况,从而得到分群的客户。其中...

    要实现精细化运营,就需要对用户进行分层,筛选出各层次的用户,这样运营才能针对性的制作策略去运营。我今天就来说下用户分层经典的模型RFM模型与聚类分析模型,今天主要介绍RFM模型

    一、什么是RFM模型

    RFM是3个指标的缩写,最近一次消费时间间隔(Recency),消费频率(Frequency),消费金额(Monetary)。而RFM模型就是通过这三项指标,来描述客户的价值状况,从而得到分群的客户。其中R是指用户的最近一次消费时间距现在有多长时间了,这个指标反映用户流失与复购(粘性)

    F是指用户在指定观察的周期内消费了几次。这个指标反映了用户的消费活跃度(忠诚度)

    M是指用户在指定的观察周期内在平台花了多少钱,这个指标反映用户对公司贡献的价值(营收)

    二、什么时候用

    任何模型最终都是腰围业务服务的,并不任何时候、任何数据都可以套用这个模型最客户分群的。用RFM模型时需要考虑下面几个因素需要客户有一定的消费频次,像房子、耐用品、家私这类,客户不会隔三差五去消费这些东西,所以这类的消费数据要做客户价值分析的话,RFM不是一个好的选择

    需要客户有消费金额,对企业产生价值

    需要记录有用户ID,这样RFM分层完后才能对应上

    RFM 更使用于传统企业里的运营商、银行、航空,以及互联网消费行业

    三、怎么用

    下面我就接着上一篇文章中京东消费者数据,用python来实现RFM模型,由于数据集中缺少购买金额这个数据,所以这个维度我就先忽略不看,重要的还是思路

    import pandas as pd

    import matplotlib.pyplot as plt

    import seaborn as sns

    %matplotlib inline

    jd_consumer=pd.read_excel('./京东消费者分析数据.xlsx',sheet_name='JD_Fnl')

    jd_consumer.head()观察购买次数频率的分布

    jd_consumer[jd_consumer['type']=='Order'].groupby('customer_id').size().sort_values(ascending=False)

    customer_id

    653834 3

    813206 2

    228162 2

    507444 2

    1496979 2

    ..

    1087899 1

    1087819 1

    1087596 1

    1087560 1

    64 1

    Length: 10652, dtype: int64

    我只选择消费食品的用户用来分析,因为用户在一定时间内购买食品的频次比其他电子产品、服饰等更活跃对数据进行整合,以2018年04月15号到2018年3月1号为观察的时间区间

    #对列重命名

    jd_consumer.rename(columns={'action_date':'action_time'},inplace=True)

    #提取时间中的小时时段

    jd_consumer['action_date']=jd_consumer['action_time'].apply(lambda x:pd.datetime.strftime(x,'%Y-%m-%d'))

    jd_consumer['action_month']=jd_consumer['action_time'].apply(lambda x:pd.datetime.strftime(x,'%Y-%m'))

    jd_consumer_food=jd_consumer[(jd_consumer['type']=='Order') &

    (jd_consumer['shop_category']=='Food') &

    (jd_consumer['action_month']=='2018-03')][['customer_id',

    'action_date','type']].drop_duplicates()R

    idx=jd_consumer_food.groupby('customer_id').size().sort_values(ascending=False)[:1000].index

    jd_rfm=jd_consumer_food[jd_consumer_food['customer_id'].isin(idx)].groupby('customer_id').agg({'action_date':'max','type':'count'})

    jd_rfm['R']=(pd.to_datetime('2018-04-15')-pd.to_datetime(jd_rfm['action_date'])).dt.days

    jd_rfm.rename(columns={'type':'F'},inplace=True)

    jd_rfm=jd_rfm.drop('action_date',axis=1)这里需要注意,R、F阈值的划分需要与实际的业务相结合,制定出贴合业务的阈值,这样划分出来的结果才是最优的。考虑数据本身不是很全,我这里直接用均值作为阈

    rmd = jd_rfm['R'].mean()

    fmd = jd_rfm['F'].mean()

    rmd,fmd

    (29.321, 1.004)

    def customer_type(frame):

    customer_type = []

    for i in range(len(frame)):

    if frame.iloc[i,1]<=rmd and frame.iloc[i,0]>=fmd :

    customer_type.append('重要价值用户')

    elif frame.iloc[i,1]>rmd and frame.iloc[i,0]>=fmd :

    customer_type.append('重要唤回用户')

    elif frame.iloc[i,1]<=rmd and frame.iloc[i,0]

    customer_type.append('重要深耕用户')

    elif frame.iloc[i,1]>rmd and frame.iloc[i,0]

    customer_type.append('即将流失用户')

    frame['classification'] = customer_type

    customer_type(jd_rfm)

    print('不同类型的客户总数:')

    print('--------------------')

    jd_rfm.groupby(by='classification').size().reset_index(name='客户数')

    四、用户分类完整表

    由于此数据缺失金额,所以没能进行一个完整的RFM分析,不过具体的思路上面已经阐释清楚了,以下附上一个完整的RFM用户分类表作为实战参考

    五、后续

    RFM可以根据用户的这三类数据进行分层,但实际中很多其它维度的数据,所以为了更好的实现精细化运营,需要更多的维度参与进来。下一篇我会介绍怎么实现给用户打标签,为用户画像

    以下链接可到上一篇文章Wvvi:电商消费者数据分析​zhuanlan.zhihu.com

    展开全文
  • python之航空公司客户价值分析 (二)-附件资源
  • 航空公司客户价值分析Python源码
  • ⑶从营销角度讲,客户价值分析实际上是一个市场细分问题,解决市场细分问题比较常用的方法是聚类分析;⑷对不同价值的客户类别提供个性化的服务,并且制定相应的营销策略,使得公司的利益最大化。这个就是那个csv...
  • 建立合理的客户价值评估模型,对客户进行分群
  • 通过Python实现电子产品销售分析、数据可视化及RFM用户价值分析的一般模板,运行环境Python3.0以上
  • Python课程设计,选题为航天公司客户价值分析 1.第一簇人群,4654人,最大的特点就是平均折扣率都是最高的,应该是属于乘坐高等舱的商务人员,应该重点保持的对象,也是需要重点发展的对象,另外应该积极采取相关的...
  • 目前航空公司已积累了大量的会员档案信息和其乘坐航班记录 以2014-03-31为结束时间选取宽度为两年的时间段作为分析观测窗口抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据44个特征总共62988条记录数据...
  • 欢迎关注 ,专注Python、数据分析、数据挖掘、好玩工具! RFM 建模是一种用于评估客户价值的营销分析技术。RFM 模型基于三个因素: Recency:客户最近购买的情况 Frequency:客户进行购买的频率 Monetary Value:...

    欢迎关注 ,专注Python、数据分析、数据挖掘、好玩工具!

    RFM 建模是一种用于评估客户价值的营销分析技术。RFM 模型基于三个因素:

    • Recency:客户最近购买的情况
    • Frequency:客户进行购买的频率
    • Monetary Value:顾客在购买上花了多少钱

    RFM 模型提供了上述三个度量的数值。这些价值观有助于公司更好地了解客户潜力。

    如果客户在过去一年中每天从星巴克购物,但在上个月没有购买任何东西,他们可能会转向竞争对手的品牌。

    星巴克可以针对这些客户,提出一个营销策略,把他们赢回来。

    在本文中,我将向你展示如何使用 Python 构建 RFM 模型。我们将使用包含4000多个唯一客户ID的数据集,并将RFM值分配给每个客户。

    第一步

    从 Kaggle 获取数据:https://www.kaggle.com/carrie1/ecommerce-data,确保在设备上安装了Python IDE以及Pandas库。

    使用以下代码行读取下载的数据集:

    import pandas as pd
    df2 = pd.read_csv('data.csv',encoding='unicode_escape')
    

    现在,让我们看一下数据帧:

    df.head()
    


    对于此分析,我们将只使用四列:数量(Quantity)、发票日期(InvoiceDate)、单价(UnitPrice)和客户ID(CustomerID)。

    第二步

    让我们先计算每个客户的总花费(Monetary Value)。

    为此,我们需要使用 UnitPrice 和 Quantity 列。我们将首先将这些值相乘,以获得每个客户在每笔交易中花费的总金额。

    下面是执行此操作的代码:

    df['Total'] = df['Quantity']*df['UnitPrice']
    

    现在,我们需要在整个数据集中找到同一客户花费的总金额。我们可以使用以下代码行来做到这一点:

    m = df.groupby('CustomerID')['Total'].sum()
    m = pd.DataFrame(m).reset_index()
    

    第三步

    现在,让我们计算频率(Frequency)。我们希望找到每个客户购买的次数。

    让我们再次看看数据帧,看看如何做到这一点:

    要查找每个客户的购买次数,我们需要使用 CustomerID 和 InvoiceDate 列。

    为此,请运行以下代码行:

    freq = df.groupby('CustomerID')['InvoiceDate'].count()
    f = pd.DataFrame(freq).reset_index()
    

    第四步

    最后,我们可以计算数据框中每个客户的最近性(recency)。

    为了计算最近性,我们需要找到上次此人进行购买的时间。

    要找到这个值,我们需要使用 CustomerID 和 InvoiceDate 列。我们首先需要找到每个客户进行购买的最新日期。然后,我们需要给这个日期分配一些定量值。

    例如,如果两个月前看到客户 A 进行购买,两年前看到客户 B 进行购买,我们需要为客户 A 指定更高的最近值。

    为此,我们首先需要将 InvoiceDate 列转换为 datetime 对象。运行以下代码行:

    df['Date']= pd.to_datetime(df['InvoiceDate'])
    

    我们现在有了一个新的"Date"列,现在需要找到每个客户最近购买的日期。

    为此,我们需要为每个CustomerID的所有日期分配一个等级。

    最近的日期将被列为1,第二个最近的日期将被列为2,依此类推。

    运行以下代码行:

    df['rank'] = df.sort_values(['CustomerID','Date']).groupby(['CustomerID'])['Date'].rank(method='min').astype(int)
    

    现在,我们根据看到客户购物的时间进行了不同的排名。最近的购买排名为1。

    现在,让我们过滤数据帧并去掉所有其他购买。我们只需要保留最新的:

    recent = df[df['rank']==1]
    

    现在我们所需要做的就是给出一个定量的最近值。这意味着与一周前看到的人相比,一天前看到的人将获得更高的最近值。

    为此,我们只需计算数据框中的每个日期与最早日期之间的差值。这样,最近的日期将具有更高的值。

    运行以下代码行:

    recent['recency'] = recent['Date'] - pd.to_datetime('2010-12-01 08:26:00')
    


    上面的数据框对于每个 CustomerID 都有许多重复的值。这是因为细分是按产品进行的,同一客户同时购买了多个产品。

    让我们仅选择CustomerID和Recenty列并删除重复项:

    recent = recent[['CustomerID','recency']]
    recent = recent.drop_duplicates()
    

    第五步

    我们现在已经完成了RFM值的计算。我们将结果存储在单独的数据帧中,因此让我们将它们合并在一起:

    finaldf = f.merge(m,on='CustomerID').merge(recent,on='CustomerID')
    

    总结

    我们已成功地将 RFM 值附加到数据集中的每个客户ID,可以根据这些计算建立某种聚类模型,将类似的客户分组在一起。


    技术交流

    欢迎转载、收藏、有所收获点赞支持一下!

    在这里插入图片描述
    目前开通了技术交流群,群友超过2000人,添加方式如下:

    如下方式均可,添加时最好方式为:来源+兴趣方向,方便找到志同道合的朋友

    • 方式一、发送如下图片至微信,进行长按识别,回复加群;
    • 方式二、直接添加小助手微信号:pythoner666,备注:来自CSDN
    • 方式三、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

    在这里插入图片描述

    展开全文
  • 客户价值分析; 随着电商行业竞争越来越激烈推广费用也是越来越高加之电商法的出台刷单冲销量的运营思路已不再适应企业需求而应将更多的思路应转向客户做好客户运营才是企业生存的王道 ;系统设计;系统结构图;业务流程...
  • 本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点和价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。在这里是用K-...
  • python数据分析与数据挖掘 航空公司客户价值分析
  • 构造信用卡客户风险关键特征 #(1)行为特征;(2)经济风险特征#;(3)收入风险特征;(4)标准化数据 data_action = data[['瑕疵户','逾期','呆账','强制停卡记录','退票','拒往记录']] data_jingji = data[['借款...
  • 航空公司客户价值分析,航空公司客户价值分析源数据,Python源码
  • 利用Python分析航空公司客户价值

    千次阅读 多人点赞 2020-01-11 16:19:40
    利用Python分析航空公司客户价值 一、背景介绍 随着社会生活中数据量的急剧增多,如何从这些海量的数据中提取与发掘出对我们决策有用的信息成为当前亟待解决的题,因此,数据分析与挖掘技术在这些年得到了广泛的...
  • Python数据分析与应用航空公司客户价值分析.ppt大数据,成就未来 * 大数据挖掘专家 * 大数据挖掘专家 大数据,成就未来 航空公司客户价值分析 * 目录 分析航空公司现状 1. 行业内竞争 民航的竞争除了三大航空公司...
  • 航空公司客户价值分析(K_Means聚类分析) 最近在看黄红梅、张良均老师主编的《Python数据分析与应用》,拿书里的案例练练手。 本案例将使用航空公司客户数据,结合RFM模型,采用K_Means聚类算法,对客户惊醒分群,...
  • python数据分析:客户价值分析案例实战

    万次阅读 多人点赞 2018-08-24 10:58:54
    简介:本案例以电信运营商客户信息为数据,通过层次聚类和K-means聚类,对用户划分成不同的群体,然后可以根据用户群体的不同特征提供个性化的策略,从而达到提高ARPU的效果。 1.商业理解 根据客户的日常消费...
  • 经过整理的航空公司客户价值分析代码与数据集,编程语言为Python。代码涉及到数据预处理与建模的各阶段。建模算法采用的是KMeans算法。
  • 航空公司客户价值大数据分析全部的源代码,使用python编写,含数据部分
  • Python-航空公司客户价值分析

    千次阅读 2020-12-19 17:10:31
    Python-航空公司客户价值分析 记第一次用python做项目是如此困难(仅仅是基础练习项目)以下是我学习的【干货】心路历程。 项目思路流程(大纲) 一个完整的数据分析项目由如下几个步骤组成: 1)数据获取:分为...
  • 《航空公司客户价值分析》数据源(第7章).zip 详细文章教程如下:https://blog.csdn.net/Gabrielle_OyO/article/details/111406756 免费开源,欢迎补充
  • 对不同的客户类别进行特征分析,比较不同类客户客户价值。 对不同价值客户类别提供个性化服务,制定相应的营销策略。 2. 分析方法与过程 本案例的目标是客户价值识别。 识别客户价值应用最广泛的模型是通过3个...
  • python之航空公司客户价值分析(一)

    千次阅读 2019-01-27 23:43:42
    python之航空公司客户价值分析 (一) 背景与挖掘目标分析方法与过程 背景与挖掘目标 企业营销的焦点从产品中心转变为客户中心,客户关系管理成为企业的核心问题。客户管理关键是客户分类,通过客户分类,区分一般...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,209
精华内容 9,283
关键字:

python客户价值分析