【数据分析案例】游戏付费用户RFM分析案例

前言:

该案例由随机生成数据模拟半年时间内,对游戏用户充值金额情况进行用户价值分层


数据特征:

所有数据均为随机生成数据,一共有三个数据特征,分别是

r_datatime:充值时间,时间截格式,由radar库生成,时间范围为:2022-6-1至2022-12-30

r_uid:用户ID,字符串格式,由numpy库生成,以9开头生成1000个用户ID

r_price:充值金额,数值格式,由numpy库生成,随机抽取[10,60,180,300,680,1180,1980,3480,6480]中的一个充值面额


实践思路:

1.导入相关模块,生成随机数据

2.设置数据格式和调整显示方式

3.搭建RFM用户价值分层模式

4.按等距分箱的形式给用户打分

5.统计各层用户数量情况


案例详解:

导入相关模块,如果没有,则手动安装,安装方式: pip install 库名

import pandas as pd    # pip install pandas
import radar           # pip install radar
import numpy as np     # pip install numpy

生成随机时间

时间选取了2022年下半年,可自行调整时间节点

r_datatime = []
for d in range(10000):
    d = str(radar.random_datetime("2022-6-1", "2022-12-30"))
    r_datatime.append(d)

生成随机金额

充值面额参考了王者荣耀的充值面额,可自行调整面额数值

# 生成随机金额
r_price = []
for p in range(10000):
    p = np.random.choice([10, 60, 180, 300, 680, 1180, 1980, 3480, 6480])
    r_price.append(p)

生成1000个用户(以9开头)

数据总行数为10000条,可根据需求自行调整用户个数

r_uid = []
for u in range(10000):
    u = str(np.random.randint(999999000, 1000000000))
    r_uid.append(u)

合并数据

注:每行数据均表示为2022-6-1至2022-12-30期间,1000个用户中的一个用户充值了随机面额

data = pd.DataFrame(data={"uid": r_uid, "price": r_price, "date": r_datatime})

设置数据格式和调整显示方式

pd.set_option('expand_frame_repr', False)  # 当列太多时显示不清楚
pd.set_option('display.unicode.east_asian_width', True)  # 设置输出右对齐
data['date'] = data['date'].astype('datetime64[ns]')
data['date'] = pd.to_datetime(data['date']).dt.floor('d')  # 调整时间格式,只保留日期

注意:生成用户ID时,已设置调整为字符串格式,而randint是随机生成指定范围内的整数,只有时间需要另外调整格式

搭建RFM用户价值分层模式

RFM = data.groupby('uid', as_index=False).agg(last_date=('date', 'max'),
                                              F=('date', 'count'),
                                              M=('price', 'sum'))
RFM['R'] = (pd.to_datetime('2022-12-31') - RFM['last_date']).dt.days
RFM.drop(columns=['uid', 'last_date'], inplace=True)

按等距分箱的形式给用户打分

以下面参数为例,因为10000条数据中有1000个用户的付费情况,因此单个用户的最后付费时间R有可能拉的很长。通过统计总数据的充值均数,平均用户充值额度为1600左右,因此把F区间设置在25以下,50为假设区间(报错就往上调整)M值参考了王者荣耀的贵族阶级分层,略微调整了下,各位可自行根据数据分布设置合理区间(主要是懒得去琢磨了)。

RFM['R_score'] = pd.cut(RFM['R'],
                        right=False,
                        bins=[1, 7,14,30,90,200],
                        labels=[5, 4, 3, 2, 1]).astype('int')
RFM['F_score'] = pd.cut(RFM['F'],
                        right=False,
                        bins=[0,4,8,10,12,50],
                        labels=range(1, 6)).astype('int')
RFM['M_score'] = pd.cut(RFM['M'],
                        right=False,
                        bins=[1,500,2000,10000,40000,100000],
                        labels=range(1, 6)).astype('int')

注意:

bins为划分范围,受用户数量、时间范围以及充值面额的影响,

因此,在调整过程中,注意适当调整bins的划分区间

用户分数统计后,根据用户评分情况设立标签

# 按平均值划分高低
RFM['R_level'] = (RFM['R_score'] >= RFM['R_score'].mean()) * 1
RFM['F_level'] = (RFM['F_score'] >= RFM['F_score'].mean()) * 1
RFM['M_level'] = (RFM['M_score'] >= RFM['M_score'].mean()) * 1
RFM['用户类别'] = RFM['R_level'].astype('str').str.cat([RFM['F_level'].astype('str'), RFM['M_level'].astype('str')])
RFM['用户类别'] = RFM['用户类别'].replace(['111', '110', '101', '100', '011', '010', '001', '000'],
                                  ['重要价值客户', '一般价值客户', '重要发展客户', '一般发展客户', '重要保持客户', '一般保持客户', '重要挽留客户', '一般挽留客户'])

注:标签的评分定义可自行调整,作者是直接按平均数来划分

统计各层用户数量情况

最后,统计每个层次的用户数量,根据分布情况分析用户近半年的付费意愿

data = RFM.groupby('用户类别').agg(num=('F', 'count')).sort_values(by='num', ascending=False).reset_index()

完整代码:

# !/usr/bin/python3.7
# -*- coding:utf-8 -*-
# @author:inganxu
# CSDN:inganxu.blog.csdn.net
# @Date:2022年10月25日


import pandas as pd
import radar
import numpy as np


# 生成随机时间
r_datatime = []
for d in range(10000):
    d = str(radar.random_datetime("2022-6-1", "2022-12-30"))
    r_datatime.append(d)

# 生成随机金额
r_price = []
for p in range(10000):
    p = np.random.choice([10, 60, 180, 300, 680, 1180, 1980, 3480, 6480])
    r_price.append(p)

# 生成1000个用户
r_uid = []
for u in range(10000):
    u = str(np.random.randint(999999000, 1000000000))
    r_uid.append(u)

data = pd.DataFrame(data={"uid": r_uid, "price": r_price, "date": r_datatime})
# 调整格式
pd.set_option('expand_frame_repr', False)  # 当列太多时显示不清楚
pd.set_option('display.unicode.east_asian_width', True)  # 设置输出右对齐
data['date'] = data['date'].astype('datetime64[ns]')
data['date'] = pd.to_datetime(data['date']).dt.floor('d')  # 调整时间格式,只保留日期


# RFM用户价值分层模型
RFM = data.groupby('uid', as_index=False).agg(last_date=('date', 'max'),
                                              F=('date', 'count'),
                                              M=('price', 'sum'))
RFM['R'] = (pd.to_datetime('2022-12-31') - RFM['last_date']).dt.days
RFM.drop(columns=['uid', 'last_date'], inplace=True)
print(RFM)
print('\n')
print('-' * 100)
print('\n')

# 按等距分箱的形式计分
RFM['R_score'] = pd.cut(RFM['R'],
                        right=False,
                        bins=[1, 7,14,30,90,200],
                        labels=[5, 4, 3, 2, 1]).astype('int')
RFM['F_score'] = pd.cut(RFM['F'],
                        right=False,
                        bins=[0,4,8,10,12,50],
                        labels=range(1, 6)).astype('int')
RFM['M_score'] = pd.cut(RFM['M'],
                        right=False,
                        bins=[1,500,2000,10000,40000,100000],
                        labels=range(1, 6)).astype('int')
# 按平均值划分高低
RFM['R_level'] = (RFM['R_score'] >= RFM['R_score'].mean()) * 1
RFM['F_level'] = (RFM['F_score'] >= RFM['F_score'].mean()) * 1
RFM['M_level'] = (RFM['M_score'] >= RFM['M_score'].mean()) * 1
RFM['用户类别'] = RFM['R_level'].astype('str').str.cat([RFM['F_level'].astype('str'), RFM['M_level'].astype('str')])
RFM['用户类别'] = RFM['用户类别'].replace(['111', '110', '101', '100', '011', '010', '001', '000'],
                                  ['重要价值客户', '一般价值客户', '重要发展客户', '一般发展客户', '重要保持客户', '一般保持客户', '重要挽留客户', '一般挽留客户'])
print(RFM)
print('\n')
print('-' * 100)
print('\n')
# 统计各类别数量
data = RFM.groupby('用户类别').agg(num=('F', 'count')).sort_values(by='num', ascending=False).reset_index()
print(data)

结语:

该案例主要是为搭建RFM用户价值模型提供代码思路

数据分析方法-RFM用户价值分层模型_inganxu的博客-CSDN博客_rfm分类法优缺点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RFM模型是电商用户数据分析中常用的一种模型,用于衡量用户价值和忠诚度。RFM模型包括三个指标: R (Recency):最近一次购买时间距离当前时间的天数,表示用户的活跃度。 F (Frequency):用户购买的次数,表示用户的忠诚度。 M (Monetary):用户购买的总金额,表示用户的价值。 以下是一个电商平台的用户RFM模型分析案例和对应的 SQL 语句: 1. 计算每个用户的R、F、M值 ```sql SELECT user_id, DATEDIFF(NOW(), MAX(purchase_time)) AS R, COUNT(*) AS F, SUM(amount) AS M FROM purchase_table GROUP BY user_id; ``` 2. 对R、F、M值进行分组,并计算每个组的平均值和标准差 ```sql SELECT CASE WHEN R < 30 THEN '1. 0-30' WHEN R < 60 THEN '2. 31-60' WHEN R < 90 THEN '3. 61-90' ELSE '4. 91+' END AS R_Group, CASE WHEN F < 2 THEN '1. 1-2' WHEN F < 4 THEN '2. 3-4' WHEN F < 6 THEN '3. 5-6' ELSE '4. 7+' END AS F_Group, CASE WHEN M < 100 THEN '1. 0-100' WHEN M < 200 THEN '2. 101-200' WHEN M < 500 THEN '3. 201-500' ELSE '4. 501+' END AS M_Group, COUNT(*) AS user_count, AVG(R) AS avg_R, AVG(F) AS avg_F, AVG(M) AS avg_M, STDDEV(R) AS std_R, STDDEV(F) AS std_F, STDDEV(M) AS std_M FROM (SELECT user_id, DATEDIFF(NOW(), MAX(purchase_time)) AS R, COUNT(*) AS F, SUM(amount) AS M FROM purchase_table GROUP BY user_id) AS RFM GROUP BY R_Group, F_Group, M_Group; ``` 这里的 R_Group、F_Group、M_Group 分别代表 R、F、M 指标的分组,分别将用户的 R、F、M 值分成四组,分别是 0-30、31-60、61-90、91+ 天,1-2、3-4、5-6、7+ 次,0-100、101-200、201-500、501+ 元。可以根据实际业务场景进行适当调整。 通过RFM模型的分析,可以对用户进行分类,进而制定更有针对性的营销策略,提高用户忠诚度和购买频率,从而提高电商平台的销售额。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inganxu

感谢您的支持!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值