欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python使用RMF聚类分析客户价值

程序员文章站 2022-06-04 18:37:44
投资机构或电商企业等积累的客户交易数据繁杂。需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略。 用户分析指标 根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标 R-最近一次消费(Rec ......

投资机构或电商企业等积累的客户交易数据繁杂。需要根据用户的以往消费记录分析出不同用户群体的特征与价值,再针对不同群体提供不同的营销策略。

用户分析指标

根据美国数据库营销研究所arthur hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标

    r-最近一次消费(recency)

    f-消费频率(frequency)

    m-消费金额(monetary)


Python使用RMF聚类分析客户价值

通过该图将用户进行分类:

    r、f、m都很高,重要价值客户(vip客户)

    f、m很高,r不高,重要保持客户

    r、f、m都很低,流失客户

    m很高,r、f不高,重要挽留客户

 

根据这8个类别的r、f、m指标,对用户进行标注,哪些是重要价值客户,哪些是重要保持客户,哪些是重要发展客户,哪些是流失客户等

 

流程介绍

以r、f、m这三个核心指标为维度进行聚类分析

利用k-means聚类分析将用户分类

根据r、f、m指标,对用户进行标注

 

准备工作:
数据

     某电商企业客户近期购买的数据。包含客户注册日期,最后购买日期以及购买消费总金额

 

参数:

r-求出最近一次投资时间距提数日天数

f-月均投资次数

m-月均投资金额


目标:分析客户交易数据,用户群体的特征与价值,进行精准营销,降低营销成本,提高销售业绩。

1  分析数据获取rfm

r-求出最近一次投资时间距提数日天数

    确定一个提现日,减去用户的最新投资日期

f-月均投资次数

    总投资次数/总月数

m-月均投资金额

    投资总金额/总月数

 

Python使用RMF聚类分析客户价值

 

处理数据获取r-f-m

def datachange(data):
    deadline_time = datetime(2016,7,20)
    print(deadline_time)

    # 时间相减 得到天数查 timedelta64类型
    diff_r = deadline_time - data["最近一次投资时间"]

    # 渠道具体天数
    # days = diff_r[0].days
    r = []
    for i in diff_r:
        days = i.days
        r.append(days)

    print(r)
    '''
    用户在投时长(月
    python没有直接获取月数差的函数
    1、获取用户在投天数
    2、月=在投天数/30,向上取整
    '''
    diff = deadline_time - data["首次投资时间"]
    print(diff)

    # 利用向上取整函数
    months = []
    for i in diff:
        month = ceil(i.days/30)
        months.append(month)

    print(months)

    # 月均投资次数
    month_ave = data["总计投标总次数"]/months
    f = month_ave.values
    print(f)

    # 月均投资金额
    m = (data["总计投资总金额"]/months).values
    print(m)

    return r, m, f

 2 训练kmeans模型

先对数据进行转换,然后通过k—means模型训练,生产模型

def analy_data(data, r, m, f):
    cdata = dataframe([r, list(f), list(m)]).t
    # 指定cdata的index和colums
    cdata.index = data.index
    cdata.columns = ["r-最近一次投资时间距提数日的天数", "f-月均投资次数", "月均投资金额"]
    print("cdata_info:\n", cdata)

    print("cdata:\n", cdata.describe())

    # k-means聚类分析

    # 01 数据标准化  均值:cdata.mean()   标准差:cdata.std()
    # 对应位置分别先相减 再相除
    zcdata = (cdata-cdata.mean())/cdata.std()
    print("zcdata:\n", zcdata)

    # n_clusters:分类种数  n_jobs:计算的分配资源  max_iter:最大迭代次数  random_state:随机数种子,种子相同,参数固定
    kmodel = kmeans(n_clusters=4, n_jobs=4, max_iter=100, random_state=0)
    kmodel.fit(zcdata)
    print(kmodel.labels_)

 

3  通过模型对用户标注

   # 统计每个类别的频率
    value_counts = series(kmodel.labels_).value_counts()
    print(value_counts)

    # 将类别标签赋回原来的数据
    cdata_rst = pd.concat([cdata, series(kmodel.labels_, index=cdata.index)], axis=1)
    print(cdata_rst)

    # 命名最后一列为类别
    cdata_rst.columns = list(cdata.columns) + ["类别"]
    print(cdata_rst)

    # 按照类别分组统计r, f, m的指标均值
    user_ret = cdata_rst.groupby(cdata_rst["类别"]).mean()
    print(user_ret)

 

'''

        r-最近一次投资时间距提数日的天数   f-月均投资次数         月均投资金额
类别
0 27.859375 2.820312 21906.754297
1 20.684211 4.552632 115842.105263
2 10.568182 5.579545 26984.313636
3 12.111111 17.277778 107986.000000

结论:
类别3:r、f、m都比较高,属于重要价值客户 或 超级用户
类别0:r、f、m都比较低,属于低价值客户
类别1:r一般、f一般、m很高,也属于重要价值客户

'''

通过模型对新用户标注

1、获取新用户数据

2、通过和原数据处理获取rfm

3、通过训练模型得出用户类型

def user_classes(cdata, user_info):
    '''
    # 模拟一条用户数据
    1、获取当前时间表示为截止时间
    2.计算出: r f m

    '''
    r, m, f = user_info_change(user_info)
    user_data_info = dataframe([[r], [f], [m]]).t
    print(user_data_info)

    # user_data_info = dataframe([[12.5], [18.0], [20000.0]]).t
    user_data_info.index = ["lily"]
    user_data_info.columns = cdata.columns
    print("cdata_info:\n", user_data_info)

    new_zcdata = (user_data_info-cdata.mean())/cdata.std()
    print("new_zcdata", new_zcdata)

    kmodel = load_model("user_classes.pkl")
    ret = kmodel.predict(new_zcdata)
    print("new_zcdata_ret:", ret)
    # new_zcdata_ret: [3]

 Python使用RMF聚类分析客户价值