机器学习:从数据中找到用户的RFM值

265 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前言

学这一课的时候,回想了下之前的公司运营有去拉取GMV、DAU、MAU、邀新活动邀请了多少新用户、搞一次活动的成交量、一段时间内产生了多少新用户等,平时做的需求大致分为:从0到1完成平台基本功能、设定目标开发功能使其达到(比如今年内要增长50w用户进而开发邀信奖励功能;增加曝光开发浏览赠币功能;让用户习惯使用app开发养成类功能)、搞促销薄利多销、搞秒杀营造气氛、提高用户体验、围绕基础功能打造生态、追赶同行补齐、看同行某个功能效果不错“抄作业”等等。

和利用数据分析、机器学习来做运营的本质区别是:一个是根据经验去做看效果(数据),一个是从历史数据去分析(包括预测)再去做。正好是反过来的,但是并不是说第一种就不好,这是两个不同的阶段,第二阶段是基于第一阶段产生的数据来实现的,但是我们需要有意识走向第二阶段。在第二阶段企业希望能用更优质的产品和更精准的服务留住用户,这就需要用户精准画像

用户画像

也称用户模型,是一种在营销规划或商业设计上描绘目标用户的方法,经常有多种组合,方便规划者用来分析并设置其针对不同用户类型所开展的策略。

描绘目标用户可以从年纪、职业、收入、喜好与行为等方面。

RFM

对于电商平台,RFM(Recency、Frequency、Monetary)常用于用户画像:

  • Recency代表用户上次消费以来的天数。
  • Frequency代表用户是否频繁使用服务。这也是用户黏性的风向标。
  • Monetary代表用户在一段时间内消费的总金额。

下面根据课程中的机器学习项目的五大步骤逐步开始。

image.png

1.定义问题

利用用户的基本信息和消费行为数据求出RFM值,利用RFM值,给用户画像,进而绘制出高价值、中价值和低价值用户的分布情况。

其中RFM值的获取属于数据收集和预处理中的特征工程,标签并不直接来自于原始数据而是求出了RFM作为特征。

image.png

2.数据收集和预处理

收集数据

课程提供的demo数据

import pandas as pd  # 导入Pandas

df_sales = pd.read_csv(
    '/Users/wanghaifeng/Documents/零基础实战机器学习/geektime-main/获客关05/易速鲜花订单记录.csv')  # 载入数据
df_sales.head()  # 显示头几行数据

image.png

数据可视化

import matplotlib.pyplot as plt  # 导入matplotlib的pyplot模块

df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期'])
df_orders_monthly = df_sales.set_index('消费日期')['订单号'].resample('M').nunique()  # 每个月的订单数量

# 设定绘图的画布
ax = pd.DataFrame(df_orders_monthly.values).plot(grid=True, figsize=(12, 6), legend=False)
ax.set_xlabel('月份')
ax.set_ylabel('订单数')
ax.set_title('月度订单数')
# 设定X轴月份显示格式
plt.xticks(range(len(df_orders_monthly.index)), [x.strftime('%m.%Y') for x in df_orders_monthly.index], rotation=45)
plt.show()

image.png

数据清洗

df_sales = df_sales.drop_duplicates()  # 删除重复的数据行
df_sales.isna().sum()  # 统计为NaN的个数 这里为0
df_sales.describe()  # df_sales的统计信息

image.png

可以发现数量的min有问题。

df_sales = df_sales.loc[df_sales['数量'] > 0] # 清洗掉数量小于等于0的数据
df_sales.describe()  # df_sales的统计信息

再次查看:

image.png

特征工程-RFM

RFM需要用户码、消费日期、订单总价来获取,所以需要先算出总价:

df_sales['总价'] = df_sales['数量'] * df_sales['单价']  # 计算每单的总价
df_sales.head()

image.png

构建用户层级表

下面先构建用户层级表,再把RFM三列逐个拼接在后面:

df_user = pd.DataFrame(df_sales['用户码'].unique())  # 生成以用户码为主键的结构df_user
df_user.columns = ['用户码']  # 设定字段名
df_user = df_user.sort_values(by='用户码', ascending=True).reset_index(drop=True)  # 按用户码排序
df_user

image.png

求出R值

df_recent_buy = df_sales.groupby('用户码').消费日期.max().reset_index()  # 构建消费日期信息,按照用户分组,消费日期变成最近的日期
df_recent_buy.columns = ['用户码', '最近日期']
df_recent_buy['R值'] = (
        df_recent_buy['最近日期'].max() - df_recent_buy['最近日期']).dt.days  # 计算每个用户的最近购买日期,离所有数据最近日期最大值的天数,也就是R值
df_user = pd.merge(df_user, df_recent_buy[['用户码', 'R值']], on='用户码')  # 把上次消费距最新日期的天数(R值)合并至df_user结构
df_user.head() #显示df_user头几行数据

image.png

这里的求的R值,不一定符合R的定义,应该是拉取数据时的时间不一定是df_recent_buy['最近日期'].max()

求出F值

df_frequency = df_sales.groupby('用户码').消费日期.count().reset_index()  # 计算每个用户消费次数,构建df_frequency对象
df_frequency.columns = ['用户码', 'F值']  # 设定值
df_user = pd.merge(df_user, df_frequency, on='用户码')
df_user.head()

image.png

求出M值

df_revenue = df_sales.groupby('用户码').总价.sum().reset_index()
df_revenue.columns = ['用户码', 'M值']
df_user = pd.merge(df_user, df_revenue, on='用户码')
df_user.head()

image.png

参考/来源

用户画像

零基础实战机器学习