美文网首页
数据分析—RFM分析

数据分析—RFM分析

作者: d1b0f55d8efb | 来源:发表于2018-06-13 18:22 被阅读0次

    RFM分析

    • RFM 是指根据客户活跃程度和交易金额贡献,进行客户价值细分的一种方法;


    • RFM 模型


      RFM 模型
    • 分析过程


    • 分析前提


    思路

    • 将数值型转换为时间格式(计算出最近交易时间间隔)
    • 分组分析出 R、F、M的值
    • 按权重计算得分
    • 利用quantile函数给用户分级
    #原数据
    OrderID,CustomerID,DealDateTime,Sales
     4529,   34858,    2014-05-14   ,807
    #转换为时间格式
    data['DealDateTime'] = pandas.to_datetime(
        data.DealDateTime, 
        format='%Y/%m/%d'
    )
    
    #计算日期至今有多少天
    data['DateDiff'] = pandas.to_datetime(
        'today'
    ) - data['DealDateTime']
    
    #时间抽取属性为天
    data['DateDiff'] = data['DateDiff'].dt.days
    
    #顾客最近的交易日期间距
    R_Agg = data.groupby(
        by=['CustomerID']
    )['DateDiff'].agg({
        'RecencyAgg': numpy.min
    })
    
    #顾客交易频率统计
    F_Agg = data.groupby(
        by=['CustomerID']
    )['OrderID'].agg({
        'FrequencyAgg': numpy.size
    })
    
    #交易金额汇总
    M_Agg = data.groupby(
        by=['CustomerID']
    )['Sales'].agg({
        'MonetaryAgg': numpy.sum
    })
    
    #对R F M结果进行整合
    aggData = R_Agg.join(F_Agg).join(M_Agg)
    
    #设计分组  分组的数据为得分
    bins = aggData.RecencyAgg.quantile(
        q=[0, 0.2, 0.4, 0.6, 0.8, 1],
        interpolation='nearest'
    )
    bins[0] = 0  #避免最小值不闭合的错误 把最小值设置为0
    labels = [5, 4, 3, 2, 1]
    #用cut方法得分计算
    R_S = pandas.cut(
        aggData.RecencyAgg, 
        bins, labels=labels
    )
    
    bins = aggData.FrequencyAgg.quantile(
        q=[0, 0.2, 0.4, 0.6, 0.8, 1],
        interpolation='nearest'
    )
    bins[0] = 0;
    labels = [1, 2, 3, 4, 5];
    F_S = pandas.cut(
        aggData.FrequencyAgg, 
        bins, labels=labels
    )
    
    bins = aggData.MonetaryAgg.quantile(
        q=[0, 0.2, 0.4, 0.6, 0.8, 1],
        interpolation='nearest'
    )
    bins[0] = 0
    labels = [1, 2, 3, 4, 5]
    M_S = pandas.cut(
        aggData.MonetaryAgg, 
        bins, labels=labels
    )
    
    #添加分组列
    aggData['R_S']=R_S
    aggData['F_S']=F_S
    aggData['M_S']=M_S
    
    #计算得分权重
    aggData['RFM'] = 100*R_S.astype(int) + 10*F_S.astype(int) + 1*M_S.astype(int)
    
    #分出用户类型
    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'] = pandas.cut(
        aggData.RFM, 
        bins, labels=labels
    )
    
    #原行索引作为一列保留,列名为index
    aggData = aggData.reset_index()
    
    aggData.sort(
        ['level', 'RFM'], 
        ascending=[1, 1]
    )
    
    aggData.groupby(
        by=['level']
    )['CustomerID'].agg({
        'size':numpy.size
    })
    

    相关文章

      网友评论

          本文标题:数据分析—RFM分析

          本文链接:https://www.haomeiwen.com/subject/ryajeftx.html