前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10.RFM分析&矩阵分析1.RFM分析2.矩阵分析

10.RFM分析&矩阵分析1.RFM分析2.矩阵分析

作者头像
用户1250179
发布2018-08-02 16:35:22
9090
发布2018-08-02 16:35:22
举报
文章被收录于专栏:数说戏聊

1.RFM分析

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

指标

解释

意义

Recency近度

客户最近一次交易时间到现在的间隔

R越大,越久未发生交易;R越小,越近有交易发生

Frequency频度

客户最近一段时间内交易的次数

F越大,客户交易越频繁;F越小,客户不够活跃

Monetary额度

客户最近一段时间内交易的金额

M越大,客户价值越高;M越小,客户价值越低

屏幕快照 2018-07-07 17.08.24.png

R_S分类

F_S分类

M_S分类

客户类型

高价值客户

重点保持客户

重点发展客户

重点挽留客户

一般价值客户

一般保持客户

一般发展客户

潜在客户

1.1 RFM分析过程

1.计算RFM各项分值

  • R_S:距离当前日期越近,得分越高,最高5分,最低1分。
  • F_S:交易频率越高,得分越高,最高5分,最低1分。
  • M_S:交易金额越高,得分越高,最高5分,最低1分。

2.汇总RFM分值

代码语言:javascript
复制
RFM=100*R_S+10*F_S+1*M_S

3.根据RFM分值对客户划分8种类型

1.2 RFM分析前提

1.最近有过交易行为的客户,再次发生交易的可能性要高于最近没有交易行为的客户。 2.交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为。 3.过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性。

1.3 RFM计算过程

代码语言:javascript
复制
import pandas
import numpy
data = pandas.read_csv(
    '/users/bakufu/desktop/5.7/data.csv'        
)
Out[37]: 
       OrderID  CustomerID DealDateTime  Sales
0         4529       34858   2014-05-14    807
1         4532       14597   2014-05-14    160
2         4533       24598   2014-05-14    418
3         4534       14600   2014-05-14    401
4         4535       24798   2014-05-14    234
5         4536       44856   2014-05-14    102
6         4558       34695   2014-05-14    130
7         4559       24764   2014-05-14    377
8         4566       34765   2014-05-15    466
9         4567       34581   2014-05-15    821
10        4568       44637   2014-05-15     84
       ...         ...          ...    ...
15866    54843       24686   2015-09-25    683
[15867 rows x 4 columns]

data['DealDateTime'] = pandas.to_datetime(
    data.DealDateTime,
    format='%Y/%m/%d'        
)
Out[37]: 
       OrderID  CustomerID DealDateTime  Sales
0         4529       34858   2014-05-14    807
1         4532       14597   2014-05-14    160
2         4533       24598   2014-05-14    418
3         4534       14600   2014-05-14    401
4         4535       24798   2014-05-14    234
5         4536       44856   2014-05-14    102
6         4558       34695   2014-05-14    130
7         4559       24764   2014-05-14    377
8         4566       34765   2014-05-15    466
9         4567       34581   2014-05-15    821
10        4568       44637   2014-05-15     84
       ...         ...          ...    ...
15866    54843       24686   2015-09-25    683
[15867 rows x 4 columns]

data['DateDiff'] = pandas.to_datetime(
    'today'        
) - data['DealDateTime']
Out[41]: 
       OrderID  CustomerID DealDateTime  Sales  DateDiff
0         4529       34858   2014-05-14    807 1515 days
1         4532       14597   2014-05-14    160 1515 days
2         4533       24598   2014-05-14    418 1515 days
3         4534       14600   2014-05-14    401 1515 days
4         4535       24798   2014-05-14    234 1515 days
5         4536       44856   2014-05-14    102 1515 days
6         4558       34695   2014-05-14    130 1515 days
7         4559       24764   2014-05-14    377 1515 days
8         4566       34765   2014-05-15    466 1514 days
9         4567       34581   2014-05-15    821 1514 days
10        4568       44637   2014-05-15     84 1514 days
       ...         ...          ...    ...       ...
15866    54843       24686   2015-09-25    683 1016 days
[15867 rows x 5 columns]

data['DateDiff'] = data['DateDiff'].dt.days
Out[43]: 
       OrderID  CustomerID DealDateTime  Sales  DateDiff
0         4529       34858   2014-05-14    807      1515
1         4532       14597   2014-05-14    160      1515
2         4533       24598   2014-05-14    418      1515
3         4534       14600   2014-05-14    401      1515
4         4535       24798   2014-05-14    234      1515
5         4536       44856   2014-05-14    102      1515
6         4558       34695   2014-05-14    130      1515
7         4559       24764   2014-05-14    377      1515
8         4566       34765   2014-05-15    466      1514
9         4567       34581   2014-05-15    821      1514
10        4568       44637   2014-05-15     84      1514
       ...         ...          ...    ...       ...
15866    54843       24686   2015-09-25    683      1016
[15867 rows x 5 columns]

R_Agg = data.groupby(
    by=['CustomerID']        
)['DateDiff'].agg({
    'RecencyAgg': numpy.min        
})
Out[45]: 
            RecencyAgg
CustomerID
14568             1024
14569             1114
14570             1044
14571             1084
14572             1108
14573             1094
14574             1019
14575             1019
14576             1069
14577             1030
...                ...
44867             1107
[1200 rows x 1 columns]

F_Agg = data.groupby(
    by=['CustomerID']        
)['OrderID'].agg({
    'FrequencyAgg': numpy.size        
})
Out[47]: 
              RecencyAgg
CustomerID
14568                 15
14569                 12
14570                 15
14571                 15
14572                  8
14573                 10
14574                 15
14575                 17
14576                 13
14577                  8
...                ...
44867                 10
[1200 rows x 1 columns]

M_Agg = data.groupby(
    by=['CustomerID']        
)['Sales'].agg({
    'MonetaryAgg': numpy.sum        
})
Out[49]: 
            MonetaryAgg
CustomerID             
14568              6255
14569              5420
14570              8261
14571              8124
14572              3334
14573              4358
14574              8506
14575              7432
14576              6481
14577              2737
...                ...
44867              4187
[1200 rows x 1 columns]

aggData = R_Agg.join(F_Agg).join(M_Agg)
Out[51]: 
            RecencyAgg  FrequencyAgg  MonetaryAgg
CustomerID                                       
14568             1024            15         6255
14569             1114            12         5420
14570             1044            15         8261
14571             1084            15         8124
14572             1108             8         3334
14573             1094            10         4358
14574             1019            15         8506
14575             1019            17         7432
14576             1069            13         6481
14577             1030             8         2737
               ...           ...          ...
44867             1107            10         4187
[1200 rows x 3 columns]

bins = aggData.RecencyAgg.quantile(
    q=[0, 0.2, 0.4, 0.6, 0.8, 1],
    interpolation='nearest'        
)
Out[53]: 
0.0    1016
0.2    1023
0.4    1035
0.6    1050
0.8    1069
1.0    1281
Name: RecencyAgg, dtype: int64

bins[0] = 0
labels = [5, 4, 3, 2, 1]
R_S = pandas.cut(
    aggData.RecencyAgg,
    bins, labels=labels     
)
Out[56]: 
0.0       0
0.2    1023
0.4    1035
0.6    1050
0.8    1069
1.0    1281
Name: RecencyAgg, dtype: int64

bins = aggData.FrequencyAgg.quantile(
    q=[0, 0.2, 0.4, 0.6, 0.8, 1],
    interpolation='nearest'        
)
Out[58]: 
0.0     4
0.2    10
0.4    12
0.6    14
0.8    16
1.0    25
Name: FrequencyAgg, dtype: int64

bins[0] = 0;
labels = [1, 2, 3, 4, 5];
F_S = pandas.cut(
    aggData.FrequencyAgg,
    bins, labels=labels        
)
Out[60]: 
0.0     0
0.2    10
0.4    12
0.6    14
0.8    16
1.0    25
Name: FrequencyAgg, dtype: int64

bins = aggData.MonetaryAgg.quantile(
    q=[0, 0.2, 0.4, 0.6, 0.8, 1],
    interpolation='nearest'        
)
Out[62]: 
0.0      735
0.2     4840
0.4     5890
0.6     7036
0.8     8283
1.0    13460
Name: MonetaryAgg, dtype: int64

bins[0] = 0;
labels = [1, 2, 3, 4, 5]
M_S = pandas.cut(
    aggData.MonetaryAgg,
    bins, labels=labels        
)
Out[64]: 
0.0        0
0.2     4840
0.4     5890
0.6     7036
0.8     8283
1.0    13460
Name: MonetaryAgg, dtype: int64

aggData['R_S']=R_S
aggData['F_S']=F_S
aggData['M_S']=M_S
Out[66]: 
            RecencyAgg  FrequencyAgg  MonetaryAgg R_S F_S M_S
CustomerID                                                   
14568             1024            15         6255   4   4   3
14569             1114            12         5420   1   2   2
14570             1044            15         8261   3   4   4
14571             1084            15         8124   1   4   4
14572             1108             8         3334   1   1   1
14573             1094            10         4358   1   1   1
14574             1019            15         8506   5   4   5
14575             1019            17         7432   5   5   4
14576             1069            13         6481   2   3   3
14577             1030             8         2737   4   1   1
               ...           ...          ...  ..  ..  ..
44867             1107            10         4187   1   1   1
[1200 rows x 6 columns]

aggData['RFM'] = 100*R_S.astype(int) + 10*F_S.astype(int) + 1*M_S.astype(int)
Out[68]: 
            RecencyAgg  FrequencyAgg  MonetaryAgg R_S F_S M_S  RFM
CustomerID                                                        
14568             1024            15         6255   4   4   3  443
14569             1114            12         5420   1   2   2  122
14570             1044            15         8261   3   4   4  344
14571             1084            15         8124   1   4   4  144
14572             1108             8         3334   1   1   1  111
14573             1094            10         4358   1   1   1  111
14574             1019            15         8506   5   4   5  545
14575             1019            17         7432   5   5   4  554
14576             1069            13         6481   2   3   3  233
14577             1030             8         2737   4   1   1  411
               ...           ...          ...  ..  ..  ..  ...
44867             1107            10         4187   1   1   1  111
[1200 rows x 7 columns]

bins = aggData.RFM.quantile(
    q=[
        0, 0.125, 0.25, 0.375, 0.5,
        0.625, 0.75, 0.875, 1
    ],
    interpolation='nearest'
)
Out[70]: 
0.000    111
0.125    131
0.250    222
0.375    254
0.500    334
0.625    422
0.750    454
0.875    532
1.000    555
Name: RFM, dtype: int64

bins[0] = 0
labels = [1, 2, 3, 4, 5, 6, 7, 8]
aggData['level'] = pandas.cut(
    aggData.RFM,
    bins, labels=labels        
)
Out[72]: 
0.000      0
0.125    131
0.250    222
0.375    254
0.500    334
0.625    422
0.750    454
0.875    532
1.000    555
Name: RFM, dtype: int64

aggData = aggData.reset_index()
Out[74]: 
      CustomerID  RecencyAgg  FrequencyAgg  MonetaryAgg R_S F_S M_S  RFM level
0          14568        1024            15         6255   4   4   3  443     6
1          14569        1114            12         5420   1   2   2  122     1
2          14570        1044            15         8261   3   4   4  344     5
3          14571        1084            15         8124   1   4   4  144     2
4          14572        1108             8         3334   1   1   1  111     1
5          14573        1094            10         4358   1   1   1  111     1
6          14574        1019            15         8506   5   4   5  545     8
7          14575        1019            17         7432   5   5   4  554     8
8          14576        1069            13         6481   2   3   3  233     3
9          14577        1030             8         2737   4   1   1  411     5
         ...         ...           ...          ...  ..  ..  ..  ...   ...
1199       44867        1107            10         4187   1   1   1  111     1
[1200 rows x 9 columns]

aggData.sort_values(
    ['level', 'RFM'],
    ascending=[1, 1]
)
Out[75]: 
      CustomerID  RecencyAgg  FrequencyAgg  MonetaryAgg R_S F_S M_S  RFM level
4          14572        1108             8         3334   1   1   1  111     1
5          14573        1094            10         4358   1   1   1  111     1
42         14610        1075             7         3685   1   1   1  111     1
59         14627        1076             8         3809   1   1   1  111     1
81         14649        1092             5          735   1   1   1  111     1
82         14650        1122             6         3074   1   1   1  111     1
101        14669        1106             6         2708   1   1   1  111     1
117        14685        1078             9         3839   1   1   1  111     1
123        14691        1091            10         3538   1   1   1  111     1
144        14712        1142             8         3788   1   1   1  111     1
         ...         ...           ...          ...  ..  ..  ..  ...   ...
1188       44856        1017            23        10852   5   5   5  555     8
[1200 rows x 9 columns]

aggData.groupby(
    by=['level']        
)['CustomerID'].agg({
    'size': numpy.size
})
Out[76]: 
       size
level      
1       153
2       164
3       135
4       153
5       154
6       142
7       151
8       148

2.矩阵分析

根据事物(如产品、服务等)等两个重要指标作为分析依据,进行关联分析,找出解决问题等一种分析方法。

屏幕快照 2018-07-07 20.38.02.png

代码语言:javascript
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas
import matplotlib
import matplotlib.pyplot as plt

#定义主题颜色,使用RGB方式
mainColor = (42/256, 87/256, 141/256, 1);

#设置字体
font = {
    'family': 'Menlo',
    'size': 20        
}
matplotlib.rc('font', **font);

data = pandas.read_csv(
    '/users/bakufu/desktop/5.8/data.csv'        
)
Out[2]: 
       province  GDP      population
0        天津  1572247       14945
1        北京  2133083       21332
2        上海  2356094       24204
3        江苏  6508832       79498
4        浙江  4015350       55030
5       内蒙古  1776951       25012
6        辽宁  2862658       43907
7        福建  2405576       37900
8        广东  6779224      106840
9        山东  5942659       97614
10       吉林  1380381       27518
11       重庆  1426540       29807
12       湖北  2736704       58075
13       陕西  1768994       37696
14       宁夏   275210        6579
15       新疆   926410       22814
16       湖南  2704846       67139
17       河北  2942115       73582
18       青海   230112        5806
19      黑龙江  1503938       38446
20       海南   350072        8994
21       四川  2853666       81236
22       山西  1275944       36389
23       河南  3493938      100377
24       江西  1570859       45322
25       安徽  2084875       60564
26       广西  1567297       47365
27       西藏    92083        3148
28       云南  1281459       47003
29       甘肃   683527       25865
30       贵州   925101       35051

#如果数据点很多可以调大尺寸
fig = plt.figure(
    figsize=(30, 20),
    dpi=80        
)

#将图形分为一行一列, 当前操作第一个子图
sp = fig.add_subplot(111)

sp.set_xlim([
    0,
    data.GDP.max()*1.1        
])

sp.set_ylim([
    0,
    data.population.max()*1.1        
])

image.png

代码语言:javascript
复制
#关闭坐标轴、坐标轴的刻度值
#sp.axis('off')
sp.get_xaxis().set_ticks([])
sp.get_yaxis().set_ticks([])

#画点
sp.scatter(
    data.GDP, data.population,
    alpha=0.5, s=200, marker="o",
    edgecolors=mainColor, linewidths=5        
)

#画均值线
sp.axvline(
    x=data.GDP.mean(),
    linewidth=1, color=mainColor
)

sp.axhline(
    y=data.population.mean(),
    linewidth=1, color=mainColor       
)

sp.axvline(
    x=0,
    linewidth=3, color=mainColor        
)

sp.axhline(
    y=0,
    linewidth=3, color=mainColor
)

sp.set_xlabel('GDP')
sp.set_ylabel('人口')

#画标签
data.apply(
    lambda row: plt.text(
            row.GDP,
            row.population,
            row.province,
            fontsize=15
            ),
    axis=1
)

plt.show()

image.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.RFM分析
    • 1.1 RFM分析过程
      • 1.2 RFM分析前提
        • 1.3 RFM计算过程
        • 2.矩阵分析
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档