持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
前言
学这一课的时候,回想了下之前的公司运营有去拉取GMV、DAU、MAU、邀新活动邀请了多少新用户、搞一次活动的成交量、一段时间内产生了多少新用户等,平时做的需求大致分为:从0到1完成平台基本功能、设定目标开发功能使其达到(比如今年内要增长50w用户进而开发邀信奖励功能;增加曝光开发浏览赠币功能;让用户习惯使用app开发养成类功能)、搞促销薄利多销、搞秒杀营造气氛、提高用户体验、围绕基础功能打造生态、追赶同行补齐、看同行某个功能效果不错“抄作业”等等。
和利用数据分析、机器学习来做运营的本质区别是:一个是根据经验去做看效果(数据),一个是从历史数据去分析(包括预测)再去做。正好是反过来的,但是并不是说第一种就不好,这是两个不同的阶段,第二阶段是基于第一阶段产生的数据来实现的,但是我们需要有意识走向第二阶段。在第二阶段企业希望能用更优质的产品和更精准的服务留住用户,这就需要用户精准画像。
用户画像
也称用户模型,是一种在营销规划或商业设计上描绘目标用户的方法,经常有多种组合,方便规划者用来分析并设置其针对不同用户类型所开展的策略。
描绘目标用户可以从年纪、职业、收入、喜好与行为等方面。
RFM
对于电商平台,RFM(Recency、Frequency、Monetary)常用于用户画像:
- Recency代表用户上次消费以来的天数。
- Frequency代表用户是否频繁使用服务。这也是用户黏性的风向标。
- Monetary代表用户在一段时间内消费的总金额。
下面根据课程中的机器学习项目的五大步骤逐步开始。
1.定义问题
利用用户的基本信息和消费行为数据求出RFM值,利用RFM值,给用户画像,进而绘制出高价值、中价值和低价值用户的分布情况。
其中RFM值的获取属于数据收集和预处理中的特征工程,标签并不直接来自于原始数据而是求出了RFM作为特征。
2.数据收集和预处理
收集数据
课程提供的demo数据。
import pandas as pd # 导入Pandas
df_sales = pd.read_csv(
'/Users/wanghaifeng/Documents/零基础实战机器学习/geektime-main/获客关05/易速鲜花订单记录.csv') # 载入数据
df_sales.head() # 显示头几行数据
数据可视化
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()
数据清洗
df_sales = df_sales.drop_duplicates() # 删除重复的数据行
df_sales.isna().sum() # 统计为NaN的个数 这里为0
df_sales.describe() # df_sales的统计信息
可以发现数量的min有问题。
df_sales = df_sales.loc[df_sales['数量'] > 0] # 清洗掉数量小于等于0的数据
df_sales.describe() # df_sales的统计信息
再次查看:
特征工程-RFM
RFM需要用户码、消费日期、订单总价来获取,所以需要先算出总价:
df_sales['总价'] = df_sales['数量'] * df_sales['单价'] # 计算每单的总价
df_sales.head()
构建用户层级表
下面先构建用户层级表,再把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
求出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头几行数据
这里的求的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()
求出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()