前言:

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


数据特征:

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

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分类法优缺点

游戏付费用户RFM分析案例相关推荐

  1. 电商用户RFM分析(平均值计算中心点)

    原始数据集 python代码 使用jupyter notebook编辑 import pandas as pd import matplotlib.pyplot as plt plt.rcParams ...

  2. 聚类分析在用户行为中的实例_网站用户行为分析案例

    一.案例综述 案例编号:101001 案例名称:互联网行业--网站用户行为分析 作者姓名(或单位.或来源):刘莎莎 案例所属行业:G6020互联网信息 案例所用软件: .Sas EG.TOAD.SAS ...

  3. 软件开发之计划阶段: ”声控打鼓”游戏的”用户/场景”分析

    "用户/场景"分析(a.k.a user scenarios)对于软件开发的计划阶段是十分重要的.只有明确了软件的用户群,以及软件所应用的场合,才能真正了解到所要开发的软件是否有价 ...

  4. 用户行为分析案例——天池数据集User Behavior Data from Taobao

    用户行为分析过程 说明 一.数据集与分析目的 1.数据集 2.分析目的 二.数据处理 1.数据预览 2.数据处理 三.数据提取与分析 1.网站流量分析 2.用户分析 3.商品销售分析 四.总结 1.关 ...

  5. kaggle实战:基于超市消费数据的用户个性化分析案例

    大家好,今天给大家分享一篇 kaggle 数据集的新文章:基于一份超市消费数据集的用户个性化分析以及用户分群的实现. 更多详细内容参考原数据集地址: https://www.kaggle.com/co ...

  6. 基于RFM模型对借贷App用户分层分析案例

    一.目的 1.根据还款未复贷老户的借贷数据,对老户进行群体分类: 2.对不同的客户群体进行特征分析,以便于定向营销. 二.分析过程 1.分析思路 数据包含了2018年4月13日至2020年4月9日期间 ...

  7. 用户留存分析案例 | 以京东、淘宝、饿了么为例!

    我们把完成激活并在一段时间内继续进行使用.浏览.或者购买等关键行为的用户叫做留存用户.我们在做用户增长往往重视了获客,而容易忽略留存.就算我们获取的用户很多,如果留存差,当流失的用户大于获取用户数,我 ...

  8. 学习:关于游戏用户流失分析方法

    三步骤: 流失分析 游戏次日流失分析 游戏中长期流失分析 part 1 流失分析 定位流失用户,挖掘流失用户流失前的最后行为,从而发现导致这类流失的原因 需求开发的重要前提: 1. 与需求方(运营)明 ...

  9. RFM分析 | 一招搞定精细化客户管理,盒马鲜生等企业都在用

    阿里巴巴CEO张勇在盒马鲜生的管理会上说:"进行RFM用户分析 ,以数据驱动,精细化用户运营是核心.新模式要大胆假设小心求证,验证有效以后再快速复制."RFM与精细化管理有什么关系 ...

  10. [数据分析] RFM分析方法

    美图欣赏2022/06/08 RFM分析方法 作用:对用户分类,识别出有价值的用户,对不同价值的用户使用不同的运营决策,把公司有限的资源发挥到最大的效果(用于用户价值细分,精细化运营) RFM是3个指 ...

最新文章

  1. html 甘特图_甘特图该如何部署
  2. 今晚8点直播 | 美团是怎么玩儿AI的?大牛揭秘美团超大规模数据集——美团大脑
  3. 直观讲解一下 RPC 调用和 HTTP 调用的区别!
  4. 多个tab可以组成一个表单吗 js_11个表单设计小技巧
  5. Python 数据结构_堆栈
  6. 学习Java--JDK的下载安装和配置
  7. 有关数据库的多库查询
  8. 哪个牌子的平板电脑好_重庆智能会议平板哪个牌子好?软硬件好才是真的好!...
  9. GIT项目管理工具(part7)--移动或者删除文件
  10. 领域应用 | NLP 和知识图谱:金融科技领域的“双子星”
  11. 千峰前端html个人笔记
  12. 华为千亿美金年报里的5G、AI、云计算
  13. 宝宝纸尿裤怎么选?我联合2000位宝妈,对20款纸尿裤做了次测评
  14. Cocos creator接 IOS 穿山甲
  15. 从Flink SQL doesn't support consuming update and delete changes 错误谈起
  16. 终于有人把TCP/IP讲的明明白白了,搞懂真的不难,只需要看这一篇就够了
  17. 多项目同时进行如何做好进度管理?
  18. 程序员北漂没钱整租,如何爱上合租?
  19. JavaScript名字的由来
  20. android修改输出分辨率,编译Android8.1修改默认分辨率和屏幕密度

热门文章

  1. docker修改nginx容器主页内容信息【还能这样操作?】
  2. 深度学习要多深,才能读懂人话?|阿里小蜜前沿探索
  3. js递归处理删除某些节点
  4. [iOS]手把手教你实现微信小视频
  5. 常见负载均衡服务器介绍
  6. 阮一峰mysql_阮一峰:理解矩阵乘法
  7. matlab中单刀双掷开关,单刀双掷开关与双刀双掷开关的区别
  8. 【我的OpenGL学习进阶之旅】什么是PVR文件以及如何打开它?
  9. 动态规划——Weighted Interval Scheduling
  10. vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能