精华内容
下载资源
问答
  • 2018-06-11 18:11:00

    RFM模型是衡量客户价值和客户创利能力的重要工具和手段。RFM分析模型主要由三个指标组成,下面对这三个指标的定义和作用做下简单解释:

    1、最近一次消费(Recency)
    最近一次消费意指用户上一次购买的时间,理论上,上一次消费时间越近的顾客应该是比较好的顾客,对提供即时的商品或是服务也最有可能会有反应。因为最近一次消费指标定义的是一个时间段,并且与当前时间相关,因此是一直在变动的。最近一次消费对营销来说是一个重要指标,涉及吸引客户,保持客户,并赢得客户的忠诚度。
    2、消费频率(Frequency)
    消费频率是顾客在一定时间段内的消费次数。最常购买的消费者,忠诚度也就最高,增加顾客购买的次数意味着从竞争对手处偷取市场占有率,由别人的手中赚取营业额。
    根据这个指标,我们又把客户分成五等分,这个五等分分析相当于是一个“忠诚度的阶梯”(loyalty ladder),其诀窍在于让消费者一直顺着阶梯往上爬,把销售想像成是要将两次购买的顾客往上推成三次购买的顾客,把一次购买者变成两次的。
    3、消费金额(Monetary)
    消费金额是对购彩产能的最直接的衡量指标,也可以验证“帕雷托法则”(Pareto’s Law)——公司80%的收入来自20%的顾客。

    FRM就是根据客户活跃度和交易金额贡献,进行客户价值细分的一种方法。

    RFM算法步骤:
    1.计算RFM各项分值
    R_S,距离当前日期越近,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。
    F_S,交易频率越高,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。
    M_S,交易金额越高,得分越高,最高7分,最低1分,按实际数据分布情况切割依次从高到低取分数。

    2.归总RFM分值
    RFM赋予权重(目前权重采用R:F:M = 1:1:1),权重乘以分数归总RFM分值。这个总RFM分值作为衡量用户价值的关键指标。公式如下:

    3.根据RFM分值对客户分类

    # encoding: utf-8
    
    
    """
    function:RFM用户价值分析分成5类
    author:dongli
    update_date:2018-06-07
    """
    
    # 导入包
    import pandas as pd
    ######################################################写入excel设置问题#########################################
    import xlsxwriter
    # 定义RFM函数
    def RFM(aggData):
    
        """
    
        :param aggData: 输入数据集,数据集字段要包含recency,frequency,monetary等三个字段
        :return:返回数据集结果
        """
        # 计算R_S
        bins = aggData.recency.quantile(q=[0, 0.28, 0.38, 0.46, 0.53, 0.57, 0.77, 1], interpolation='nearest')
        bins[0] = 0
        labels = [7, 6, 5, 4, 3, 2, 1]
        R_S = pd.cut(aggData.recency, bins, labels=labels)
    
        # 计算F_S
        bins = aggData.frequency.quantile(q=[0, 0.29, 0.45, 0.60, 0.71, 0.76, 0.90, 1], interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5, 6, 7]
        F_S = pd.cut(aggData.frequency, bins, labels=labels)
    
        # 计算M_S
        bins = aggData.monetary.quantile(q=[0, 0.20, 0.26, 0.45, 0.55, 0.76, 0.85, 1], interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5, 6, 7]
        M_S = pd.cut(aggData.monetary, bins, labels=labels)
    
        # 赋值
        aggData['R_S'] = R_S
        aggData['F_S'] = F_S
        aggData['M_S'] = M_S
    
        # 计算FRM值
        aggData['RFM'] = R_S.astype(int)*1 + F_S.astype(int)*1 + M_S.astype(int)*1
    
    
        # 根据RFM分值对客户分类
    
    
        #分五类
        bins = aggData.RFM.quantile(q=[0, 0.2, 0.4, 0.6, 0.8, 1],interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5]
        aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels)
    
        # 分八类
        # bins = aggData.RFM.quantile(q=[0, 0.125, 0.25, 0.375, 0.5,0.625, 0.75, 0.875, 1],interpolation='nearest')
        # bins[0] = 0
        # labels = [1, 2, 3, 4, 5, 6, 7, 8]
        # aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels )
    
    
    
    
        return aggData
    
    
    # 主函数
    if __name__ == '__main__':
    
        # 读取数据
        aggData = pd.read_csv('C:\\Users\\xiaohu\\Desktop\\月刊数据\\4月份用户价值数据.csv')
    
    
        # 调用模型函数
        result=RFM(aggData)
    
        # 打印结果
        print(result)
    
    
        # 计算每个类别的数据量
    
        c1=list(result["level"].value_counts())
    
    
        # 计算每个类别所占的百分比
    
        c2 = list(result["level"].value_counts()/len(result)*100)
    
        c3=(list(map(lambda x:str(round(x,3))+"%",c2)))
    
        c=pd.DataFrame({"level":range(1,len(c1)+1),"数量":c1,"百分比":c3})
    
    
        print(c)
    
        # 写出csv
    
        result.to_csv('C:\\Users\\xiaohu\\Desktop\\月刊数据\\result5_50_四月份.csv',index=False)
    
    
        # ## 先写出excel
        # workbook = xlsxwriter.Workbook("C:\\Users\\xiaohu\\Desktop\\月刊数据\\result_RFM.xlsx",options={'strings_to_urls': False})
        #
        # format = workbook.add_format()
        # format = workbook.add_format()
        # format.set_border(1)
        # format_title = workbook.add_format()
        # format_title.set_border(1)
        # format_title.set_bg_color('#cccccc')
        # format_title.set_align('center')
        # format_title.set_bold()
        # format_ave = workbook.add_format()
        # format_ave.set_border(1)
        # format_ave.set_num_format('0')
        #
        # data_format = workbook.add_format()
        # data_format.set_num_format('yyyy-mm-dd HH:MM:SS')
        # data_format.set_border(1)
        #
        # worksheet2 = workbook.add_worksheet('用户价值')
        # title2 = [u'user_id', u'recency', u'frequency', u'monetary',u'R_S',u'F_S',u'M_S',u'RFM', u'level']
        #
        # worksheet2.write_row('A1', title2, format_title)
        # worksheet2.write_column('A2:', result.iloc[:, 0], format_ave)
        # worksheet2.write_column('B2:', result.iloc[:, 1], format)
        # worksheet2.write_column('C2', result.iloc[:, 2], format)
        # worksheet2.write_column('D2', result.iloc[:, 3], format)
        # worksheet2.write_column('E2', result.iloc[:, 4], format)
        # worksheet2.write_column('F2', result.iloc[:, 5], format)
        # worksheet2.write_column('G2', result.iloc[:, 6], format)
        # worksheet2.write_column('H2', result.iloc[:, 7], format)
        # worksheet2.write_column('I2', result.iloc[:, 8], format)
        #
        # workbook.close()
        #
    
    

    RFM+kmeans算法

    # encoding: utf-8
    """
    function:RFM用户价值分析+kmeans算法自动划分
    author:dongli
    update_date:2018-05-09
    """
    
    # 导入包
    from __future__ import  division
    import pandas as pd
    from sklearn.cluster import KMeans
    
    
    ######################################python画图显示中文参数设置####################################
    ##########设置中文显示#################
    from pylab import *
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    font_size =11 # 字体大小
    fig_size = (8, 6) # 图表大小
    # 更新字体大小
    mpl.rcParams['font.size'] = font_size
    # 更新图表大小
    mpl.rcParams['figure.figsize'] = fig_size
    ###################################################################################################
    
    # 定义RFM函数
    def RFM(aggData):
        """
        :param aggData: 输入数据集,数据集字段要包含recency,frequency,monetary等三个字段
        :return:返回数据集结果
        """
        # 计算R_S
        bins = aggData.recency.quantile(q=[0, 0.31, 0.38, 0.46, 0.53, 0.57, 0.77, 1], interpolation='nearest')
        bins[0] = 0
        labels = [7, 6, 5, 4, 3, 2, 1]
        R_S = pd.cut(aggData.recency, bins, labels=labels)
    
        # 计算F_S
        bins = aggData.frequency.quantile(q=[0, 0.29, 0.45, 0.60, 0.71, 0.76, 0.90, 1], interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5, 6, 7]
        F_S = pd.cut(aggData.frequency, bins, labels=labels)
    
        # 计算M_S
        bins = aggData.monetary.quantile(q=[0, 0.20, 0.26, 0.45, 0.55, 0.76, 0.85, 1], interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5, 6, 7]
        M_S = pd.cut(aggData.monetary, bins, labels=labels)
    
        # 赋值
        aggData['R_S'] = R_S
        aggData['F_S'] = F_S
        aggData['M_S'] = M_S
    
        # 计算FRM值
        aggData['RFM'] = R_S.astype(int) + F_S.astype(int) + M_S.astype(int)
    
        #分五类
        bins = aggData.RFM.quantile(q=[0, 0.2, 0.4, 0.6, 0.8, 1],interpolation='nearest')
        bins[0] = 0
        labels = [1, 2, 3, 4, 5]
        aggData['level'] = pd.cut(aggData.RFM,bins, labels=labels)
    
        return aggData
    
    
    
    
    # 读取数据
    aggData = pd.read_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\用户价值分析RFM模型\\source\\RFM_Data_50.csv')
    # print(aggData)
    
    aggData2=RFM(aggData)
    print(aggData2)
    
    
    
    
    
    # 选择recency,frequency,monetary这三列
    data=aggData2.loc[:,['recency','frequency','monetary']]
    
    print(data)
    
    # 定义数据标准化函数 Min-max 标准化
    def Normalization(df):
        return df.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
    
    # 调用函数进行数据标准化(0-1)之间
    zsredfile=Normalization(data)
    
    
    
    # 对列进行重命名
    names = ['ZR','ZF','ZM']
    zsredfile.columns = names
    
    print(zsredfile)
    
    
    ##########################################选择最佳的K值########################################################
    
    """
    一般我们可以 通过迭代的方式选出合适的聚类个数 ,即让k值从1到K依次执行一遍,
    再查看每一次k值对应的簇内离差平方和之和的变化,
    如果变化幅度突然由大转小时,那个k值就是我们选择的合理个数
    """
    K = range(1,15)
    GSSE = []
    for k in K:
    
        print(K)
    
        SSE = []
    
        kmeans = KMeans(n_clusters=k, random_state=10)
    
        kmeans.fit(zsredfile)
    
        labels = kmeans.labels_
    
        centers = kmeans.cluster_centers_
        for label in set(labels):
            SSE.append(np.sum(np.sum((zsredfile[['ZR', 'ZF','ZM']].loc[labels == label,] - centers[label, :]) ** 2)))
    
        GSSE.append(np.sum(SSE))
    
    # 绘制K的个数与GSSE的关系
    plt.plot(K, GSSE, 'b*-')
    
    plt.xlabel('聚类个数')
    
    plt.ylabel('簇内离差平方和')
    
    plt.title('选择最优的聚类个数')
    
    plt.show()
    
    
    ###########################################################################################################################
    
    #########选择最优的聚类个数为5
    seed(123)
    #调用sklearn的库函数
    num_clusters = 5
    kmeans = KMeans(n_clusters=num_clusters, random_state=1)
    kmeans.fit(zsredfile)
    
    
    # 聚类结果标签
    data['cluster'] = kmeans.labels_
    # 聚类中心
    centers = kmeans.cluster_centers_
    
    cluster_center = pd.DataFrame(kmeans.cluster_centers_)
    # 绘制散点图
    plt.scatter(x = zsredfile.iloc[:,0], y = zsredfile.iloc[:,1], c = data['cluster'], s=50, cmap='rainbow')
    plt.scatter(centers[:,0], centers[:,1], c='k', marker = '*', s = 180)
    plt.xlabel('ZR')
    plt.ylabel('ZF')
    plt.title('聚类效果图')
    # 图形显示
    plt.show()
    
    
    
    # # 查看RFM模型8个类别中的用户数量以及占比多少
    
    result=data
    
    aggData2['cluster']=result["cluster"]
    # 计算每个类别的数据量
    
    c1 = list(result["cluster"].value_counts())
    
    # 计算每个类别所占的百分比
    
    c2 = list(result["cluster"].value_counts() / len(result) * 100)
    
    c3 = (list(map(lambda x: str(round(x, 3)) + "%", c2)))
    
    c = pd.DataFrame({"level": range(1, len(c1) + 1), "数量": c1, "百分比": c3})
    
    print(c)
    
    
    # 写出csv
    
    aggData2.to_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\东篱最终项目\\【修改版】用户价值分析项目--东篱\\RFM+K-Means算法对公司客户价值自动划分--东篱\\resource\\python_result_kmeans_50.csv', index=False)
    
    cluster_center.to_csv('C:\\Users\\xiaohu\\Desktop\\用户价值分析\\东篱最终项目\\【修改版】用户价值分析项目--东篱\\RFM+K-Means算法对公司客户价值自动划分--东篱\\resource\\cluster_center.csv')

    RFM+层次聚类

    # -*- coding:utf-8 -*-
    
    #######################################
    #加载相关库
    #######################################
    import numpy as np
    import pandas as pd
    from sklearn.cluster import DBSCAN
    from sklearn.cluster import Birch
    from sklearn import metrics
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    from sklearn.externals import joblib
    import time
    import datetime
    
    #######################################
    #加载数据集及提取数列
    #######################################
    
    customdata = pd.read_csv(r'C:\\Users\\xiaohu\\Desktop\\RFM\\out_custom_label.csv')
    
    new_custom_data = customdata[["R_S","F_S","M_S"]]
    
    new_custom_data = new_custom_data.astype(np.float32)
    new_custom_data = new_custom_data.values
    
    #######################################
    #数据标准化
    #######################################
    
    new_custom_data = StandardScaler().fit_transform(new_custom_data)
    
    #######################################
    #模型训练
    #######################################
    
    Birch_model = Birch(threshold=0.85, branching_factor=500,
                        n_clusters=None,compute_labels=True, copy=True).fit(new_custom_data)
    
    #######################################
    #提取分类结果
    #######################################
    
    label = Birch_model.labels_
    
    #print ("Calinski-Harabasz Score", metrics.calinski_harabaz_score(new_custom_data, Birch_model))
    
    label = pd.DataFrame(label)
    
    label.columns = ['cluster.label']
    
    outresult = pd.concat([customdata, label], axis = 1)
    
    cluster_center = pd.DataFrame(Birch_model.subcluster_centers_)
    n_clusters = np.unique(label).size
    print("n_clusters : %d" % n_clusters)
    
    
    #######################################
    #结果输出
    #######################################
    
    outresult.to_csv('C:\\Users\\xiaohu\\Desktop\\RFM\\birch_outresult.csv')
    cluster_center.to_csv('C:\\Users\\xiaohu\\Desktop\\RFM\\cluster_center.csv')
    
    
    更多相关内容
  • 电商用户价值分析——基于RFM模型、KMeans聚类一、背景二、RFM模型、KMeans聚类三、数据处理四、具体分析1. 导入所需的库2. 导入数据3. 数据清洗4. 数据分析4.1 核心数据分析4.2 用户分析5. 搭建RFM模型5.1 分别构建...

    一、背景

    通过对用户价值进行分层,并针对不同用户制定不同运营策略以达到用户精准营销的策略。

    二、RFM模型、KMeans聚类

    美国数据库营销研究所Arthur Hughes的研究发现,在客户数据分析中发现了三个重要的指标,即:最近一次消费(Recency近度)、消费频率(Frequency频度)、消费金额(Monetary额度),它们是衡量客户价值的重要标准。RFM分析是一种探索性分析方法。

    k-means简介

    1.聚类算法(clustering Algorithms)介绍
    聚类是一种无监督学习—对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。
    2.k-means原理详解
    k-means是一种常见的聚类算法,也叫k均值或k平均。通过迭代的方式,每次迭代都将数据集中的各个点划分到距离它最近的簇内,这里的距离即数据点到簇中心的距离。

    三、分析框架

    在这里插入图片描述

    四、具体分析

    1. 导入所需的库

    import pandas as pd
    import numpy as np
    import datetime
    import matplotlib.pyplot as plt
    import cufflinks as cf
    cf.set_config_file(offline=True) # 离线模式绘图
    

    2. 导入数据

    data = pd.read_csv(r"D:\Desktop\python code\python数据分析\用户分群KMeans+RFM\产品销售分析.csv")
    data.head()
    

    在这里插入图片描述

    3. 数据清洗

    缺失值处理

    # 查看数据缺失
    data.isnull().sum()
    

    在这里插入图片描述

    缺失值字段均为非核心字段,后续分析可直接提取有效字段。

    重复值处理

    #查看重复值
    data.duplicated().sum()
    
    

    0

    异常值处理

    #查找付款金额小于0的数据
    abnormal=data[np.where(data['支付金额'] < 0,True,False)]
    abnormal
    

    在这里插入图片描述

    4. 数据分析

    4.1 核心数据分析

    • 总GMV
    #总GMV
    GMV=round(data['支付金额'].sum(),ndigits=2)
    

    4154205.04

    • 每月GMV
    #每月GMV
    GMV_M=data.groupby(by='event_month',as_index=True).agg({'支付金额':sum}).iplot(kind='line')
    

    在这里插入图片描述

    4月销售数据较大提升,可能是促销活动导致;
    整体上销售数据趋势有所上升,但持续性无法得到保证

    • 客单价
    #客单价
    price_uv=round(data['支付金额'].sum() / data['user_id'].nunique(),0)
    

    88.59

    • 笔单价
    #笔单价
    price_pv=round(data['支付金额'].sum() / data['order_id'].nunique(),0)
    
    

    45.56

    4.2 用户分析

    年龄

    # 先划分一下年龄
    data['age_cut'] = pd.cut(data['age'],bins=[data.age.min(),20,30,40,data.age.max()],labels=['16-20','20-30','30-40','40-50'])
    data.groupby(by=data['age_cut']).agg(age非重复计数=('user_id','nunique')).reset_index().iplot(kind='pie',labels='age_cut',values='age非重复计数')
    

    各年龄阶段消费水平对比

    import plotly.offline as py
    import plotly.graph_objs as go
    pyplt=py.offline.plot
    py.init_notebook_mode(connected=True)
    
    fig={
        "data":[
            {
                "values":a['order_id'],
                "labels":a['age_cut'],
                'domain':{'x':[0,0.8],'y':[0,0.6]},
                'name':"不同年龄段的订单占比",
                'hoverinfo':"label+percent+name",
                'hole':.3,
                'type':"pie"
            },
            {
                'values':a['amount'],
                'labels':a['age_cut'],
                'domain':{'x':[.6,1],'y':[0,.6]},
                'name':"不同年龄段的销售额占比",
                'hoverinfo':'label+percent+name',
                'hole':.3,
                'type':'pie'
            }
        ],
        'layout':{
            'title':'不同年龄段订单/销售额占比分布图',
            'annotations':[
                {
                'font':{'size':18},
                'showarrow':False,
                'text':'订单占比',
                'x':0.4,
                'y':0.255
            },
                {
                    'font':{'size':18},
                    'showarrow':False,
                    'text':'销售额占比',
                    'x':0.86,
                    'y':0.255
    
                }
            ]
        }
    }
    py.iplot(fig)
    

    在这里插入图片描述

    由图可得出:

    1. 不同年龄段订单及销售额 占比前三年龄段分别为【23-30】、【18-22】、【31-40】
    2. 消费用户主要集中在18-30岁年龄段,占比达65%

    各性别消费情况

    fig={
        "data":[
            {
                "values":b['order_id'],
                "labels":b['sex'],
                'domain':{'x':[0,0.8],'y':[0,0.6]},    
                'hoverinfo':"label+percent+name",
                'hole':.3,
                'type':"pie"
            },
            {
                'values':b['amount'],
                'labels':b['sex'],
                'domain':{'x':[.6,1],'y':[0,.6]},
                'hoverinfo':'label+percent+name',
                'hole':.3,
                'type':'pie'
            }
        ],
        'layout':{
            'title':'不同性别订单/销售额占比分布图',
            'annotations':[
                {
                'font':{'size':18},
                'showarrow':False,
                'text':'性别-付费人数占比',
                'x':0.4,
                'y':0.255
            },
                {
                    'font':{'size':18},
                    'showarrow':False,
                    'text':'性别-消费金额占比',
                    'x':0.86,
                    'y':0.255
                }
            ]
        }
    }
    py.iplot(fig)
    

    在这里插入图片描述

    图中可以得出:

    1. 用户分析-性别维度,订单量与销售额占比男性用户占比均比女性用户多出1.5个百分比;
    2. 男女比例基于付费人数与消费金额占比几乎相同。

    用户地区分布

    data.groupby(by='local',as_index=True).agg({'age':len}).sort_values(by='age',ascending=True).iplot(kind='bar',orientation='h')  # 这里要排下序
    
    

    在这里插入图片描述

    由图可得出:
    消费用户所在地区前三的分别是广东、上海、北京。

    5. 搭建RFM模型

    分别构建R、F、M

    # 上面透视表中的event_dates是每个客户的最近购买日期,我们还需要用一个固定的日期减去这一列的日期值,从而求出R
    RFM_df['event_dates'] = RFM_df['event_dates'].max()-RFM_df['event_dates']
    # 去除event_dates列中的“days”字段,以30天为周期
    RFM_df['event_dates'] = RFM_df['event_dates'].map(lambda x:x/np.timedelta64(30,'D'))
    # 将列(column)排序
    RFM_df = RFM_df[['event_dates', 'order_id', 'amount']]
    # 重命名列
    RFM_df.rename(columns={'event_dates':'R', 'order_id':'F', 'amount':'M',},inplace=True)
    RFM_df.head()
    

    在这里插入图片描述

    6. K-Means人群分类

    6.1 数据标准化

    #由于RFM量纲不同,可能导致聚类结果不好,所以我们先进行数据标准化
    from sklearn.preprocessing import StandardScaler
    #采用StandardScaler方法对数据规范化:均值为0,方差为1的正态分布
    g = StandardScaler()
    std_data= g.fit_transform(RFM_df)
    std_data= pd.DataFrame(stand_data,columns=RFM_df.columns,index=RFM_df.index)
    std_data.head()
    

    在这里插入图片描述

    # 这里划分类别用的是归一化后的数据,因为质心就是从归一化数据里建模得出的
    stand_data= pd.DataFrame(std_data)
    stand_data.rename(columns={0:'R',1:'F',2:'M'},inplace = True)
    stand_data.iplot('box',mean=True)
    

    在这里插入图片描述

    R、F、M的中位值都偏下,我们这里选用均值来判断每个质心分别时属于什么类型的客户。

    R_label = np.where(stand_data['R']>stand_data['R'].mean(),1,0)    
    F_label = np.where(stand_data['F']>stand_data['F'].mean(),1,0)     
    M_label = np.where(stand_data['M']>stand_data['M'].mean(),1,0)    
    
    stand_data= pd.DataFrame([R_label,F_label,M_label]).T
    stand_data.rename(columns={0:'R',1:'F',2:'M'},inplace = True)
    stand_data
    

    在这里插入图片描述

    6.2 手肘法和轮廓系数得出K值

    手肘法

    #根据最小的SSE原则确定簇数量,选择最佳的K值,即客户的类别数量
    from sklearn.cluster import KMeans
    #定义SSE列表,用来存放不同K值下的SSE
    SSE = []
    #定义候选K值
    for i in range(1,10):
        kmeans = KMeans(n_clusters = i,random_state = 12)
        kmeans.fit(stand_data)
        SSE.append(kmeans.inertia_)
    #使用手肘法看K值
    plt.plot(range(1,10),SSE,marker = 'o')
    plt.show()
    

    在这里插入图片描述

    根据上图显示,当k为4或5时,效果较好

    轮廓系数

    #使用轮廓系数看K值:轮廓系数是描述簇内外差异的关键指标,越接近1,聚类效果越好
    from sklearn.metrics import silhouette_score
    kc = KMeans(n_clusters=4,random_state=12)
    kc.fit(stand_data)
    silhouette_score(stand_data,kc.labels_)
    

    0.4791

    kc = KMeans(n_clusters=5,random_state=12)
    kc.fit(stand_data)
    silhouette_score(stand_data,kc.labels_)
    

    0.4949

    由手肘法和轮廓系数得出K值分成5类,聚类效果最好

    6.3 可视化分析

    增加客户级别标签

    RFM_labels = pd.read_excel(r"D:\Desktop\python code\python数据分析\用户分群KMeans+RFM\RFM_labels.xlsx")
    RFM_labels = RFM_labels.iloc[:,:-1]
    cc = pd.merge(rfm_data_centers_label, RFM_labels,on=['R','F','M'] ,how='left')
    cc['labels'] = cc.index
    # 在RFM_df后面添加客户类别列
    RFM_df = pd.merge(RFM_df,cc[['labels','客户级别']],on='labels',how='left')
    RFM_df.head()
    

    在这里插入图片描述
    可视化

    #可视化
    RFM_df.groupby('客户级别')['user_id'].count().iplot(kind='bar')
    

    在这里插入图片描述

    由图可得:
    各分群用户呈现三个梯度,
    第一梯度:一般挽留客户
    第二梯度:重要客户(挽留、发展、价值)
    第三梯度:一般发展客户
    三梯度人数比约 3:5:2

    五、分析结论与建议

    分析结论:

    1. 整理销售状况:2月-6月GMV整体呈上升趋势,但后续该趋势很难维持,需进一步分析数据,并制定相应的可落地策略;
    2. 用户年龄分布:男女比例接近1:1 ,可不分性别进行运营;
    3. 用户年龄分布:占比前三年龄段分别为【23-30】、【18-22】、【31-40】消费用户主要集中在18-30岁年龄段,占比达65%,运营策略可以基于用户年龄出发,且制定优先级。
    4. 用户地区分布:消费用户所在地区前三的分别是广东、上海、北京。即一线城市用户占比较大,可优先对此类用户进行运营策略。
    5. 分群用户:一般客户与重要客户占比约1:1,其中一般挽留客户(R低\F低\M低)占比最高,约占:30%。

    分析建议
    在这里插入图片描述

    展开全文
  • 核心内容:使用python的sklearn的KMeans算法对电商用户进行分类。 包含内容:数据概览、特征构建、k值选择、模型训练、可视化等。

    背景

    聚类分析在机器学习领域属于无监督学习的一种,能够根据一些特征对样本数据进行分类。使用聚类分析分完的类具有“类中相似,类间区别”的特点。RFM模型是非常常见的分析用户价值的方法,其核心思想是根据用户的最近购买时间、购买频次、花费金额3个特征来对用户进行分群,针对每个群体采取不同的营销手段。k-means是常用的聚类分析算法之一,基于欧氏距离对样本进行分类。k-means算法运行速度快,能够处理的数据量大,且易于理解。但缺点也很明显,就是算法性能有限,在高维上可能不是最佳选项。在当前动辄上亿的数据量来看,k-means算法是比较好的选择了。还有需要提醒的一点是,一定要结合业务使用算法,任何特征都可能拿来聚类,但是聚类的结果呢,能不能很好的解释和指导业务?如果不能,那么这个算法就没有什么意义。本次使用的数据来源于数据不吹牛公众号,这里也是小打一波广告。
    本案例将从一个简单的k-means机器学习模型入手,在介绍聚类算法的同时也简单介绍机器学习的常规步骤。

    1、数据概览

    首先,我们导入数据,并查看前5行。

    import pandas as pd
    import numpy as np
    df = pd.read_excel(r'F:\数据分析项目\电商数据的RFM模型\RFM\PYTHON-RFM实战数据.xlsx')
    df.head(5)
    

    在这里插入图片描述
    总览数据:

    df.info()
    

    在这里插入图片描述
    数据共有28833行,9列,而且数据非常干净,没有空值,省去了我们处理空值的过程。
    根据RFM模型的要求,我们需要的是买家昵称、购买日期、实付金额三个变量。其中购买日期和实付金额用于帮助我们训练模型,买家昵称则让我们确定每个用户所属的类别。

    选取交易成功的用户:

    df['订单状态'].value_counts()
    df = df[df['订单状态'] == '交易成功']
    

    在这里插入图片描述
    选择我们需要的字段:

    data = df[['买家昵称', '付款日期',  '实付金额']]
    data.head(5)
    

    在这里插入图片描述

    有个细节需要注意,订单每一行代表着单个用户的单次购买行为,什么意思呢?如果一个用户在一天内购买了4次,订单表对应记录着4行,而在实际的业务场景中,一个用户在一天内的多次消费行为,应该从整体上看作一次。 ----- 数据不吹牛 小Z

    2、特征构建

    根据我们的RFM模型,我们需要构建3列数据,这个原始表中是没有直接提供的,需要我们根据原始表的数据来提取。
    所以这里需要先提取付款日期数据:

    data['paytime'] = pd.to_datetime(data['付款日期'].apply(lambda x:x.date()))
    data.head()
    

    在这里插入图片描述
    根据paytime计算最后一次付款时间距当前的天数(数据引用的背景当前时间是2019-07-01):

    # 提取每个用户最近(最大)的购买日期
    data_r = data.groupby('买家昵称')['paytime'].max().reset_index()
    # 与当前日期相减,取得最近一次购买距当前的天数。
    data_r['recency'] = data_r['paytime'].apply(lambda x:(pd.to_datetime('2019-07-01')-x).days)
    # 两个日期相减,得到的数据类型是timedelta类型,要进行数值计算,需要提取出天数数字。
    data_r.drop('paytime',axis = 1,inplace = True)
    data_r.head()
    

    data_r表
    提取购买次数数据:

    # 分组聚合,得到每个用户发生于不同日期的购买次数
    data_f = data.groupby(['买家昵称','paytime'])['付款日期'].count().reset_index()
    data_f = data_f.groupby('买家昵称')['paytime'].count().reset_index()
    # 修改列名
    data_f.rename({'paytime':'frequence'},axis = 1,inplace = True)
    data_f.head()
    

    在这里插入图片描述
    提取购买金额数据,这里的金额我们使用每个用户的金额/次:

    data_m = data.groupby('买家昵称')['实付金额'].sum().reset_index()
    data_m['money'] = data_m['实付金额']/data_f['frequence']
    data_m.drop('实付金额',axis = 1,inplace = True)
    data_m.head()
    

    在这里插入图片描述
    所以现在我们已经有了包含recency、frequence、money的3个DataFrame表了,下面合并三个表:

    data_rf = pd.merge(data_r,data_f,on = '买家昵称',how = 'inner')
    data_rfm = pd.merge(data_rf,data_m, on = '买家昵称',how = 'inner')
    data_rfm.head()
    

    在这里插入图片描述

    3、查看数据分布特征

    数据的分布特征会影响算法结果,所以有必要先了解数据的大致分布。

    import matplotlib.pyplot as plt
    import seaborn as sns
    plt.figure(figsize = (6,4))
    sns.set(style = 'darkgrid')
    sns.countplot(data_rfm['frequence'])
    

    购买次数的分布

    sns.distplot(data_rfm['recency'])
    plt.title('recency的分布直方图',fontsize = 15)
    

    recency的分布直方图

    sns.distplot(data_rfm['money'],color = 'g')
    plt.title('money的分布直方图',fontsize = 15)
    

    在这里插入图片描述

    4、数据处理及模型构造

    首先,对数据进行标准化处理,这是为了消除量纲的影响。

    from sklearn import preprocessing
    from sklearn.cluster import KMeans
    from sklearn import metrics
    data_rfm_s = data_rfm.copy()
    min_max_scaler = preprocessing.MinMaxScaler()
    data_rfm_s = min_max_scaler.fit_transform(data_rfm[['recency','frequence','money']])
    

    K-Means方法有个经常被人诟病的地方,如何选择K值?也就是要把样本分成多少类呢?如果贸然定一个,会太主观,所以还是要用数据说话。一般采用三个指标:

    • Calinski-Harabaz Index。通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。
    • 轮廓系数。轮廓系数(Silhouette Coefficient),值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。也就是尽量选择更大的轮廓系数。
    • inertia值。kmeans自带的评价方法,越小说明聚类效果越好。
    inertia = []
    ch_score = []
    ss_score = []
    for k in range(2,9):
        model = KMeans(n_clusters = k, init = 'k-means++',max_iter = 500)
        model.fit(data_rfm_s)
        pre = model.predict(data_rfm_s)
        ch = metrics.calinski_harabaz_score(data_rfm_s,pre) 
        ss = metrics.silhouette_score(data_rfm_s,pre)
        inertia.append(model.inertia_)
        ch_score.append(ch)
        ss_score.append(ss)
    print(ch_score,ss_score,inertia)
    

    画图可以更加直观看出三个指标的变化:

    score = pd.Series([ch_score,ss_score,inertia],index = ['ch_score','ss_score','inertia'])
    aa = score.index.tolist()
    plt.figure(figsize = (15,6))
    j = 1
    for i in aa:
        plt.subplot(1,3,j)
        plt.plot(list(range(2,9)),score[i])
        plt.xlabel('k的数目',fontsize = 13)
        plt.ylabel(f'{i}值',fontsize = 13)
        plt.title(f'{i}值变化趋势',fontsize = 15)
        j+=1
    plt.subplots_adjust(wspace = 0.3)
    

    score变化
    根据上图中3个指标综合判断,选择k=4时,各指标变化出现明显的拐点,聚类效果相对较优,所以分成四类比较好。

    model = KMeans(n_clusters = 4, init = 'k-means++',max_iter = 500)
    model.fit(data_rfm_s)
    ppre = model.predict(data_rfm_s)
    ppre = pd.DataFrame(ppre)
    data = pd.concat([data_rfm,ppre],axis = 1)
    data.rename({0:u'cluster'},axis = 1,inplace = True)
    data.head()
    

    在这里插入图片描述
    可以看出,每个用户都有了对应的类别,并且可以查看每个类别的中心:

    labels = model.labels_   # 取得各样本的类别数据
    labels = pd.DataFrame(labels,columns = ['类别'])
    result = pd.concat([pd.DataFrame(model.cluster_centers_),labels['类别'].value_counts().sort_index()],axis = 1)
    result.columns = ['recency','frequence','money','cluster']
    result
    

    在这里插入图片描述
    cluster=0时的分布状态:
    在这里插入图片描述
    cluster=1时的分布状态:
    在这里插入图片描述
    cluster=2时的分布状态:
    在这里插入图片描述
    cluster=3时的分布状态:
    在这里插入图片描述

    展开全文
  • 数据挖掘之用户价值分析

    千次阅读 2015-08-26 15:47:45
    谁在使用我的网站——用户忠诚和价值分析   前面介绍的都是一些用户的行为指标和用户细分,这里要介绍的是基于每个用户行为的综合性的分析和评定,主要包括用户的忠诚度和用户的价值。“以用户为中心”的...

    前面介绍的都是一些用户的行为指标和用户细分,这里要介绍的是基于每个用户行为的综合性的分析和评定,主要包括用户的忠诚度和用户的价值。“以用户为中心”的理论要求网站不断优化改善用户的体验,进而提升用户的满意度,当用户的预期不断被满足时,用户就会喜欢上这个网站,进而发展成为网站的忠诚用户,同时不断地为网站输出价值。忠诚用户不但自身为网站创造价值,而且可以为网站带来许多隐性的收益,比如品牌和口碑的推广,带动其他用户的进入和成长。所以网站的忠诚用户是网站生存和持续发展的基石,我们需要掌握每个用户的忠诚度,同时也需要了解每个用户的价值体现。

    这次的数据分析需求来自网站的营销部门,营销部门的同事需要跟进一些网站的已付费用户和潜在的付费用户,以便更好地推广网站的产品,为客户提供更好的服务,引导新用户的消费和老客户的持续性消费。营销部门因为资源有限,面对不断扩大的客户群体开始犯愁,他们没有精力对每位用户进行跟进和服务,于是他们请求数据分析师的帮助,帮他们寻找定位目标客户,以便提升工作效率。销售部门发来了数据分析的需求邮件。

     


     

    看来这个问题确实困扰着营销部的同事,如果他们所做的营销工作大部分用户没有任何响应,这是一件让人非常沮丧的事情。他们的目的就是缩小目标群体,定位那么有意愿有潜力的价值客户,以便减少日常的无效工作,提升效率。他们需要的就是用户忠诚度的分析、用户价值的评定和用户价值的持续发展情况。我们用数据分析的方法来一一解决这些问题。

    基于用户行为的忠诚度分析

    用户忠诚度(Loyalty)是用户出于对企业或品牌的偏好而经常性重复购买的程度。对于网站来说,用户忠诚度则是用户出于对网站的功能或服务的偏好而经常访问该网站的行为。根据客户忠诚理论,传统销售行业的忠诚度可由以下4个指标来度量:

    l  重复购买意向(Repurchase Intention):购买以前购买过的类型产品的意愿;

    l  交叉购买意向(Cross-buying Intention):购买以前为购买的产品类型或扩展服务的意愿;

    l  客户推荐意向(Customer Reference Intention):向其他潜在客户推荐,传递品牌口碑的意愿;

    l  价格忍耐力(Price Tolerance):客户愿意支付的最高价格。

    以上4个指标对于电子商务网站而言,可能还有适用性,但对于大多数网站是不合适的,所以为了让分析具有普遍的适用性,同时为了满足所有的指标都可以量化(上面的客户推荐意向比较难以量化),以便进行定量分析的要求,我们选择所有网站都具备的基于访问的用户行为指标:用户访问频率最近访问间隔时间平均停留时长平均浏览页面数,这些也是Google Analytics原版本中用户忠诚度模块下的4个指标。

    这4个指标在上文已经多次提到了,定义不再重复介绍。统计数据的时间区间也是根据网站的特征来定的,如果网站的信息更新较快,用户访问较为频繁,那么可以适当选取较短的时间段,这样数据变化上的灵敏度会高些;反之,则选择稍长的时间段,这样用户的数据更为丰富,指标的分析结果也会更加准确有效。在统计得到这4个指标的数值之后,单凭指标数值还是无法得到用户忠诚度的高低,需要对指标进行标准化处理得到相应的评分,通过评分就可以分辨用户的忠诚度在总体中处于什么样的程度。

    这里使用min-max归一化的方法,将4个指标分别进行归一化后缩放到10分制(0~10分)的评分区间。这里需要注意的是,min-max归一化会受到异常值的影响,比如用户浏览页面数有一个50的异常大的数值,那么归一化后大部分的值都在集中在较小的分值区域,所以建议在归一化之前排查一下各指标是否存在异常值,如果存在,可以对异常值进行转换或过滤;同时这里的最近访问间隔时间同样适用“天”为单位,注意归一化的时候需要进行特殊处理,因为间隔天数越大,相应的评分应该越小,不同于其他3个指标,其他3个指标使用公式(x-min) / (max-min),最近访问间隔天数要使用(max-x) / (max-min)的方式进行处理。我们使用近一个月的用户访问数据,选择其中3个用户列举一下用户行为数据的处理情况,见表6-2。

    表 6-1            用户忠诚度指标评分

     

     

    访问频率

    最近访问间隔

    平均停留时长

    平均浏览页面数

    用户1

    数据

    3次

    15天

    150秒

    3页

    标准化

    0.10

    0.50

    0.30

    0.22

    评分

    1.0

    5.0

    3.0

    2.2

    用户2

    数据

    12次

    2天

    120秒

    4页

    标准化

    0.55

    0.93

    0.24

    0.33

    评分

    5.5

    9.3

    2.4

    3.3

    用户3

    数据

    1次

    21天

    300秒

    6页

    标准化

    0.00

    0.30

    0.60

    0.55

    评分

    0.0

    3.0

    6.0

    5.5

    表6-2中,用户忠诚度的4个分析指标经过标准化处理后统一以十分制的形式输出,这样就能直接区分每个用户的每项指标的表现好坏。基于每个指标的评分,可以对用户进行筛选,比如营销部门重点跟进经常访问网站的用户,可以选择访问频率评分大于3分的用户,或者重点跟进用户访问参与度较高的用户,可以筛选平均停留时间和平均访问页面数都大于3分的用户,这样能够帮助营销部门迅速定位忠诚用户。

    这里我们用4个用户行为指标来评价用户的忠诚度,这类基于多指标从多角度进行评价最常见的展现方式就是雷达图,或者叫蛛网图,在电脑游戏里面比较常见,比如一些足球游戏使用雷达图来表现球员的各方面的能力指数,如防守、进攻、技术、力量、精神等,所以这里也可以借用雷达图用4个指标来展现用户的忠诚度表现情况,如图6-18所示。

     

    图 6-1    用户忠诚度雷达图

    图6-18使用了表6-2中三位用户的评分数据绘制而成,能够非常形象地表现用户忠诚度在各指标上的表现情况,用户1的整体忠诚度较低,用户2在访问频率和访问间隔具有较好表现,而用户3的访问具有相对较高的参与度。使用雷达图分析用户的忠诚度主要有如下优势:

    u  可以完整地显示所有评价指标;

    u  显示用户在各指标评分中的偏向性,在哪些方面表现较好;

    u  可以简单观察用户整体的忠诚情况,即图形围成的面积大小(假设4个指标的权重相等,若重要程度存在明显差异,则不能用面积来衡量);

    u  可以用于用户间忠诚度的比较。

    所以,基于雷达图展现用户的忠诚度之后,营销部门可以直接查看哪些用户具有较好的忠诚度,哪些用户值得他们重点跟进。

    基于用户行为的综合评分

    上面介绍的用户忠诚度分析使用用户的4个行为指标来进行评估,但我们只能看到各指标的表现,无法评定用户忠诚度的总体水平,所以需要对所有的相关指标做汇总处理,获取一个综合评分,就像足球游戏中球员的综合能力值(Overall)。上面忠诚度的相关指标经过标准化已经统一了度量区间,最简单的方法就是取所有相关指标评分的均值来计算得到忠诚度综合评分,这样的处理将所有指标以同等的重要性进行对待,但现实情况下不同指标对综合评分的影响是不一样的,有些指标比较关键,有些则相对次要,所以这里引入AHP的方法来设定不同指标的权重。

    AHP(层次分析法)是美国运筹学家T. L. Saaty教授于20世纪70年代初期提出的,AHP是对定性问题进行定量分析的一种简便、灵活、实用的多准则决策方法。它的特点是把复杂问题中的各种因素通过划分为相互联系的有序层次,使之条理化,根据对一定客观现实的主观判断将每个层次元素两两比较的重要性进行定量描述。而后,利用数学方法计算反映每一层次元素的相对重要性次序的权值,通过所有层次之间的总排序计算所有元素的相对权重并进行排序。层次分析法适用于多目标决策,用于存在多个影响指标的情况下,评价各方案的优劣程度。当一个决策受到多个要素的影响,且各要素间存在层次关系,或者有明显的类别划分,同时各指标对最终评价的影响程度无法直接通过足够的数据进行量化计算的时候,就可以选择使用层次分析法。

    了解了AHP之后,我们以上面的忠诚度评分为例,先简单介绍AHP的应用。首先根据忠诚度的影响指标构建层次模型,这里只需要两层,上层是忠诚度,下层是影响忠诚度的4个指标,如图6-19所示。

     

    图 6-2    忠诚度评分层次模型

    我们需要计算底层的4个指标对忠诚度的影响权重,需要构建对比矩阵,即运用9标度对需要赋权的同层各影响要素间进行两两比较,例如模型中的要素i相对于要素j对上层的重要程度,1表示i与j同等重要,3表示i比j略重要,5表示i比j重要,7表示i比j重要很多,9表示i比j极其重要,可以用Wi/Wj表示该重要程度,两两比较后可以得到以下矩阵:

    两两比较的结果可以得到矩阵对角线上方的各个比值,而这个矩阵对角线两边的对称元素是相互的倒数,并且对角线的所有元素的值都为1,所以得到对角线一侧的数值就可以得到整个矩阵。因为矩阵的数值是两两比较的结果,所以可能存在A元素比B元素重要,B元素比C元素重要,但C元素却比A元素重要的情况,也就是矩阵的不一致性,所以首先需要验证该对比矩阵的一致性。可以通过计算矩阵的最大特征值的方法来衡量矩阵的一致性,相关的指标有一致性指标CI,随机一致性指标RI,一致性比率CR=CI/RI,一般当CR<0.1时,我们认为该对比矩阵的一致性是可以被接受的。如果矩阵的一致性满足要求,则可以根据矩阵的最大特征值进一步计算得到对应的特征向量,并通过对特征向量进行标准化(使特征向量中各分量的和为1)将其转化为权向量,也就是我们要求的结果,权向量中的各分量反映了各要素对其相应的上层要素的影响权重。

    因为层次分析法AHP的计算过程设计一些高等数学相关方面的知识,需要详细了解可以参考一些统计学、运筹学和决策学方面的书籍和资料,也可以在网上直接搜索AHP的分析软件,一些工具支持在输入指标两两比较的结果后就可以直接输出一致性检验结果及各层次指标的权重系数。

    如上面的忠诚度评分体系使用AHP的方法可以计算得到底层4个指标对忠诚度的影响权重:

    忠诚度评分 = 访问频率评分×0.4 + 最近访问间隔评分×0.25 +

    平均停留时长评分×0.2 + 平均浏览页面数评分×0.15

     

    在计算得到影响指标的权重之后,就可以通过加权求和的方式计算得到最终的忠诚度评分,见表6-3。

    表 6-2            用户忠诚度加权评分

     

    访问频率评分

    最近访问间隔评分

    平均停留时长评分

    平均浏览页面数评分

    忠诚度评分

    用户1

    1

    5

    3

    2.2

    2.6

    用户2

    5.5

    9.3

    2.4

    3.3

    5.5

    用户3

    0

    3

    6

    5.5

    2.8

    表6-3中,通过加权的方式计算得到用户忠诚度评分之后,就可以直接比较忠诚度评分来评价哪个用户的忠诚度综合值较高、哪个较低,营销部门的同事就有了对用户更直接的取舍依据。

    上面只是对用户的忠诚度做了评定,无法体现用户创造的价值,而营销部门的第二个需求点就是对用户的综合价值的评定,比如电子商务网站的用户可能具备一定的忠诚度,但如果只看不买,仍然无法为网站带来足够的价值,所以需要进一步评定用户的价值输出,电子商务类网站尤其可以关注这一点。为了体现用户的价值输出,我们在选择指标的时候需要考虑与用户购买消费相关的指标,这里罗列了5个指标供参考:

    1. 1.         最近购买间隔:可以取用户最近一次购买距当前的天数,反映用户是否继续保持在网站的消费;
    2. 2.         购买频率:用户在一段时间内购买的次数,重点反映用户的消费黏度;
    3. 3.         购买商品种类:用户在一段时间内购买的商品种类或商品大类,反映用户需求的广度,可以分析用户价值输出的多样性和扩展空间;
    4. 4.         平均每次消费额:用户在一段时间内的消费总额÷消费的次数,即客单价,反映用户的平均消费能力;
    5. 5.         单次最高消费额:用户在一段时间内购买的单次最高支付金额,反映用户的支付承受能力,同时也能体现用户对网站的信任度。

    上面的5个指标从不同的角度反映了用户的价值输出能力,并且是可量化统计得到的,同样有时间区间的限制,需要注意选择合适的时间段长度。为了能够统一衡量价值,同样需要对上面的5个指标进行标准化,使用10分制的方式输出进行评定,还是使用雷达图,如图6-20所示。

     

    图 6-3    用户价值雷达图

    图6-20用雷达图展现了3个用户各指标的数据表现来反映用户的价值特征,根据每个指标的属性可以将用户的价值进一步分为两块,其中最近购买间隔、购买频率和购买商品种类用来表现用户的购买忠诚度,而平均每次消费额和单次最高消费额用于反映用户的消费能力,图6-20中框起来的两块区域,雷达图的上半部分用于表现用户的购买忠诚度,下半部分用于表现用户的消费能力,从图中3个用户的数据进行分析,用户3的整体价值较低,用户1和2的价值较高,而且用户1的价值集中体现在较高的消费能力,用户2的价值更多地体现在较高的购买忠诚度。

    雷达图很好地展现了用户价值在不同指标中的体现,再结合层次分析法,就可以对用户的价值进行综合评分,基础的数据源于上面5个指标的评分结果,使用AHP不仅可以得到最终的用户价值评分,同时还可以得到上面的购买忠诚度和消费能力这两方面的评分。

     

    图 6-4    用户价值评分层次模型

    图6-21是使用AHP的方法构建的用户价值评分层次模型,底层是5个基础指标,中间层是用户价值的两个方面,分别对应各自的指标,最上层就是用户的综合价值。这里需要使用3次AHP来计算:

    1. 购买忠诚度和消费能力对用户价值的影响权重;
    2. 最近购买间隔、购买频率和购买产品种类对购买忠诚度的影响权重;
    3. 平均每次消费额和单次最高消费额对消费能力的影响权重。

    经过3次两两比较计算后就可以得到图上的每一层指标对上次的影响权重,正如连接线上标注的数值,转化为公式的结果如下:

    用户价值 = 购买忠诚度×0.67 + 消费能力×0.33

    忠诚度 = 最近购买时间×0.12 + 购买频率×0.64 + 购买产品种类×0.24

    消费能力 = 平均每次消费额×0.67 + 单词最高消费额×0.33

    经过推导,我们可以用底层5个指标的评分直接计算得到用户的综合价值评分:

    用户综合价值评分=(最近购买间隔评分×0.12+购买频率评分×0.64+购买产品种类评分×0.24)×0.67+(平均每次消费额评分×0.67+单次最高消费额评分×0.33)×0.33

     

    用户综合价值评分=最近购买间隔评分×0.08+购买频率评分×0.43+购买产品种类评分×0.16+平均每次消费额评分×0.22+单次最高消费额评分×0.11

    有了上面的计算公式,图6-21中所有层次的评分都可以计算得到了,我们根据雷达图中举例的3个用户的数据来计算一下他们的综合得分情况,见表 6-4。

    表 6-3            用户价值加权评分

     

    最近购买间隔评分

    购买频率评分

    平均每次消费额评分

    单次最高消费额评分

    购买商品种类评分

    购买忠诚度评分

    消费能力评分

    综合价值评分

    用户1

    2

    3

    8

    9

    3

    2.88

    8.33

    4.6785

    用户2

    7

    7

    6

    5

    8

    7.24

    5.67

    6.7219

    用户3

    5

    1

    3

    2

    1

    1.48

    2.67

    1.8727

    表中不仅计算得到了综合价值评分,同时得到了购买忠诚度和消费能力这两个中间层的得分,这样我们不仅能够通过直接比较用户的综合价值评分获取网站的重要用户,同时忠诚度和消费能力的评分也为针对用户的细分提供了一个有力的量化数值参考依据,如图6-22所示。

     

    图 6-5    用户价值评价细分图

    图中展示了100位用户的价值评分数据,根据购买忠诚度和消费能力的评分情况分成了4块,从中可以看出电子商务网站用户特征的分布情况:

    • 从C区域可以看出用户较多地分布在忠诚度和消费能力评分为3附近的区域,也是网站最普遍的客户群;
    • B区域的用户是网站的最有价值客户(VIP),但是数量相当稀少,可能不到10%;
    • 在A区域有一个点密集区间(忠诚度1~2、消费能力8~9),可以认为是网站的高级消费用户群,他们消费不多,但消费额很高,如果你的网站提供高价值消费品、批量购买等服务的话,那么他们就可能是那方面的客户群;
    • D区域的用户虽然消费能力也不强,但他们是网站的忠实粉丝,不要忽视这些用户,他们往往是网站线下营销和品牌口碑传播的有利拥护者。

    通过类似上面的分析过程,可以发现电子商务网站用户的某些特征,为网站的运营方向和营销策略提供一定的决策支持。如果你要制订针对用户的营销策略,你会先从A、B、C、D这4类用户群体中的哪类先下手?

     

     

    本文节选自《网站分析实战——如何以数据驱动决策,提升网站价值(全彩)》


    展开全文
  • 用户活跃/用户价值分析

    万次阅读 2018-09-07 10:38:37
    用户活跃、用户价制度分析的在数据分析师的日常工作中经常会碰到,如何根据公司的业务情况对本公司的用户做活跃和价制度的划分是一种常规化的分析工作。 在用户生命周期中,对每个用户进行群体划分,有针对性地做分...
  • 超市客户价值分析

    千次阅读 2022-04-24 16:03:47
    超市客户价值分析 项目任务: 利用超市顾客的消费信息,构建RFM模型,利用Kmeans算法对顾客进行分类,助力于企业更好地了解客户,并使他们更容易根据不同类型客户的特定需求、行为和关注点修改产品。 处理步骤 导入...
  • 用户分析

    千次阅读 2021-03-18 11:22:50
    用户分析的本质就是对用户进行分类。 用户生命周期:(拉新、促活留存、转化、推荐) 引入期—成长期—成熟期—休眠期—流失期 二、如何进行分析用户结构分析 一般包含以下几方面: 1.社会属性:年龄,性别,地域...
  • 文章目录1 简介2 数据预处理3 数据分析3.1 数据准备3.2 数据可视化3.2.1 查看数据大概分布3.2.2 分布直方图4 R、F、M模型4.1 模型含义4.2 R、F、M的均值4.3 不同类型的客户消费份额4.4 利用最近交易间隔,交易金额...
  • 2018年小红书app用户群体分析报告

    千次阅读 2021-01-14 14:49:25
    小红书是一款内容电商类产品,产品目前主要有笔记内容和电商两个模块,内容是基于UGC的生活笔记,电商部分以自营为主,第三方入驻商家为辅。...三、用户分析1. 用户画像小红书的用户以女性居多,男女比例3:7左右。...
  • 文章目录为什么要做RFM模型分析 (Why)什么是RFM模型 (What)RFM 作用RFM模型是如何实现用户客户细分的 (How)RFM 例子 (Example)RFM 评分RFM 分析 (Analysis)总结 (Conclusion) 为什么要做RFM模型分析 (Why) 一个聪明...
  • import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans data = pd.read_csv(r'credit_card.csv',sep=',',encoding='gbk') print(data.columns) ...
  • 基于RFM模型的用户价值的数据分析报告 分析背景与目的   目前企业的业务逐步从产品为主导转向以客户的需求为主导。一种全新的”以客户为中心“的业务模式正在形成并提升的前所未有的高度。然而与客户保持关系...
  • 数据分析方法-RFM用户价值分层模型

    千次阅读 2022-02-05 15:50:31
    这是一个从交易数据反推用户价值的方法
  • 29、RFM客户价值分析(有图有案例)

    千次阅读 2018-12-04 17:18:41
    RFM分析:是根据用户活跃程度和交易金额贡献,进行客户价值细分的一种方法 一、分析指标 指标 解释 意义 R(Recency)近度 客户最近一次交易时间的间隔  R越小,表示客户越近有交易发生 F...
  • 淘宝用户数据分析

    千次阅读 2022-03-14 18:08:59
    目录 第一章、绪论... 2 1.1.研究背景及现状...... 1.1.1.研究背景......1.1.2.国内外研究现状......1.2.本论文研究的目的意义......第二章、相关的理论基础......3.4.1.用户整体行为分析... 6 3.4.2.用户消.
  • 大数据下的用户价值分析

    千次阅读 2018-07-24 16:20:49
      大数据下,用户分析的核心是什么? ——解决实际问题 确定用户分析目的,具体是为了降低成本?...RFM方法是国际上最成熟、最为接受的客户价值分析方法,RFM实际上是一整套分析方法中的部分内容,但最...
  • K-Means 聚类:客户价值分析

    万次阅读 多人点赞 2018-03-16 20:36:21
    1 背景与挖掘目标1.1 背景1、航空公司业务竞争激烈,企业营销焦点从产品...2、对不同的客户类别进行特征分析,比较不同类客户的客户价值;3、对不同价值的客户类别提供个性化服务,制定相应的营销策略。2 分析方法与...
  • 数据挖掘——航空公司客户价值分析(代码完整)

    万次阅读 多人点赞 2018-01-27 00:39:59
    最近在阅读张良均、王路等人出版的书《python数据分析与挖掘实战》,其中有个案例是介绍航空公司客户价值分析,其中用到的聚类方法是K-Means方法,我一直把学习的重心放在监督学习上,今天就用这个案例练习一下非...
  • 手把手教你利用利用KMeans聚类进行航空公司客户价值分析。背景与挖掘目标1. 背景航空公司业务竞争激烈,从产品中心转化为客户中心针对不同类型客户,进行精准营销,实现利润最大化建立客户价值评估模型,进行客户...
  • 万字详解用户行为分析

    千次阅读 2022-04-02 00:48:20
    本次分析的目的是想通过对淘宝用户行为进行数据分析,为以下问题提供解释和改进建议:(1)分析用户使用APP过程中的常见电商分析指标,确定各个环节的流失率。(2)利用假设检验思想分析流失原因,找到需要改进的...
  • 1、分析模板 2、什么是RFM分析模型 3、实现思路 4、分析结果辅助业务决策 5、RFM模型深化 6、BI分析效果 pdf地址 https://download.csdn.net/download/weixin_44498127/77564468
  • 用户画像打标签之RFM客户价值分析

    千次阅读 2022-01-21 09:44:19
    RFM模型是衡量用户价值的重要工具和方法, RFM模型主要由3个 基础指标组成: (1) 最近一次消费(Recency) , 是指用户上一次购买 时间; (2) 消费频率(Frequency) , 是指用户在一定时间段内的消费 次数; ...
  • 电商用户行为数据分析

    万次阅读 多人点赞 2019-05-15 20:00:54
    本文针对淘宝app的运营数据,以行业常见指标对用户行为进行分析,包括 一、提出问题 1.电商常用分析体系 2.电商常用分析指标 3.本次分析的业务问题以及分析逻辑 本次想通过对淘宝用户行为数据的分析,解决...
  • 京东用户行为数据分析报告(python)

    千次阅读 2021-07-26 15:40:14
    1. 背景与目的 该重构项目对京东的运营数据集的用户购买行为进行分析,研究用户过程中的行为特点、购物偏好、以及在购物过程中...5) 用户价值分析 3 数据概述 3.1 数据来源 数据集来源:https://jdata.jd.com/html/de
  • 数据挖掘实战—航空公司客户价值分析

    千次阅读 多人点赞 2021-04-05 16:18:13
    通过客户分类,对客户群体进行细分,区分出低价值客户与高价值客户,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,从而实现效益(利润)最大化。本文将使用航空公司客户数据,...
  • 利用python进行用户行为分析

    千次阅读 多人点赞 2020-04-22 12:19:34
    用户行为分析 ...用户消费行为分析通过漏斗模型进行用户行为分析RFM模型分析用户价值理解数据数据清洗缺失值处理统计缺失值日期时间数据处理更改数据类型异常值处理数据分析总量pv、uv分析日访问...
  • 电商用户行为分析需求分析说明书 项目名称: 电商用户行为分析 修订时间: 2021-05-28 修订版本: 3.0 一、引言 1.目的 通过编写需求分析文档,对基于电商数据的用户行为分析系统进行介绍,使得文档的目标阅读人员...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 319,650
精华内容 127,860
关键字:

用户价值分析