如果没有做分层基本就没有在做运营这件事。——王慧文
用户分层是一个应用于产品和运营领域的概念。通常由运营人员协调数据分析部门和产品部门共同完成。
不同的用户行为会衍生出不同的特性;面对不同特性的用户,为了提高其更大的价值又对应了不同的针对办法,从而在业务上衍生了用户分层的概念。网上关于用户分层的方法已经多如牛毛,但在实际应用中依然有很多坑并未做详细的阐述。本文将以我的实战经验,按照用户分层的顺序, 细数几个大家可能不知道的知识点。
一:数据是分层的前提
完善的数据打点是用户分层必不可少的前提。
在分层的最初,最忌讳的就是经验主义者凭借自己的【感觉】对用户进行切割。
很多分层项目刚展开时,相关人员会犯 【前端可见】 就是特性的错误。打个比方,有10万名用户在论坛里发了内容,于是这10万人被分层到类似「创作者」这样的类目中,对应的可能是50万人被归类到「浏览者」这样的层级中。这并不是错误的分类,但相较于分层颗粒度太大,且很难做出对应的调整。
10万人中有多少每天都在发内容?有多少曾经发过内容现在不发了?有多少人在一天内发布的数量远超于均值?细数下去可以有无数的纬度等待挖掘,而挖掘的前提一定是前端的打点足够精细。
二:分群必不可少
分层不等于分群
用户分层是根据不同的用户行为对用户进行层级的划分;
用户分群大多是根据不同的用户属性进行群体的划分。
打个比方,男生女生、有娃无娃、老师医生这些就是用户群体的划分,而如果是 说你本次消费了8000元,是当日消费者贡献金额的前10%,这就是一个层级的划分。简单来说 ,分层和分群是动词和名词的区别。
一个用户可以同时处在多个分群中,但在一个环境中他仅可能在一个层级里。我可能是男生,同时我也可以是医生、我也可以是个有娃的宝爸,但我当前在社会上的地位尽可能是中产,不可能除了中产以外又同时是个高净值人士。
分层前尽可能先分群
很多分层模型搭建以后,会发现一个不好解释的问题:当对一个低层级的用户采取对应的运营策略后,并不起实质作用。
这个问题的出现往往是因为对分群的忽视。
假设小明是重点高中学生,小红是职业院校的学生,我们用数学、物理、英语和机械修理的分数来对两个人进行分级的话,毫无疑问,小明凭借数学、物理、英语的得分将遥遥领先于小红,并处于分层的上级。那么似乎我们找到了对应的针对办法:针对小明要补习机械修理相关知识;针对小红,要补习数学、物理、英语。
补了一个月以后,在下一次的考试中我们会发现,两人的成绩没有丝毫变化。
问题出现在:不同类型的人对应着不同的用户需求。小明无论机械修理学的多么精深,都不在他的考试清单里,小红数学、英文、物理的成绩也不会对她的就业有任何帮助。在日常的产品里,有些人的需求可能是每天来买东西,有些人不仅可以买,还能够上传自己的测评报告。
习惯和用户能力的不同造成了需求的差异,而不同需求的人进入同一个评估体系中就是不公。因此在对用户的行为进行切割前,依据产品内用户的不同的习惯进行大颗粒度分群是很有必要的。
三:评估模型
RFM很好用
RFM模型是经典的价值评估模型,诞生至今已有数十年的历史。
R:Recency,最近一次交易时间;
F:Frequency,交易频次;
M:Monetary,交易金额。
网上有关RFM的介绍已经很多,这里不做过多论述,仅说几个重要的点
RFM模型的传统三个维度可变。传统维度RFM一般应用于交易平台,但同样也可以在其他产品上大显神威。例如 社区产品就可以取类似:最近内容量、最近互动频次、最近登陆时长。
RFM相比其他方法最大的优势在于能够用最精简的数据指标搭建相对完整的评估体系。
如上图所示,RFM模型衍生了8个细分层级、但在实际应用中并非固定。具体几个层级要视实际业务特性灵活变动。
因为分群的原因, 可能导致某一些用户在某一个层级下为空。例如在社交产品中,一个仅仅喜欢浏览的忠实的用户,没有发内容的需求,他在这个层级中就会出现发布内容为空的现象,为了保持分层的公正,这样的层级应该存在且单独进行评估。
K-means辅助计算
RFM在实际应用中都必经的一道步骤就是阈值的设定。数值多少算是高?多少算作低?常见的应用办法有平均数、众数或是中位数,或者更多的是凭经验拍脑袋。
但我在实际应用中发现以上方法都会造成数值的偏颇,即假设小明小红和小刚都参加了考试,小明考了120分、小红考了10分、小刚考了60分,按照均值的处理办法=120+10+60/3=63.3分,按照这个阈值计算,很明显将小红和小刚划分为了一类人,可实际情况可能是小红从来没有学过习,而小刚一直在努力,再一次或许就能够更进步,这样的分类方法显然是不公平的。
比较靠谱的方法是k均值聚类算法(k-means clustering algorithm)。是一种迭代求解的聚类分析算法。
其步骤是:
预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
其著名的解释有:
有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。
牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……
就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。
Python实现方法如下:
import numpy as np
import pandas as pd
import random
import sys
import time
class KMeansClusterer:
def __init__(self,ndarray,cluster_num):
self.ndarray = ndarray
self.cluster_num = cluster_num
self.points=self.__pick_start_point(ndarray,cluster_num)
def cluster(self):
result = []
for i in range(self.cluster_num):
result.append([])
for item in self.ndarray:
distance_min = sys.maxsize
index=-1
for i in range(len(self.points)):
distance = self.__distance(item,self.points[i])
if distance < distance_min:
distance_min = distance
index = i
result[index] = result[index] + [item.tolist()]
new_center=[]
for item in result:
new_center.append(self.__center(item).tolist())
# 中心点未改变,说明达到稳态,结束递归
if (self.points==new_center).all():
return result
self.points=np.array(new_center)
return self.cluster()
def __center(self,list):
'''计算一组坐标的中心点
'''
# 计算每一列的平均值
return np.array(list).mean(axis=0)
def __distance(self,p1,p2):
'''计算两点间距
'''
tmp=0
for i in range(len(p1)):
tmp += pow(p1[i]-p2[i],2)
return pow(tmp,0.5)
def __pick_start_point(self,ndarray,cluster_num):
if cluster_num <0 or cluster_num > ndarray.shape[0]:
raise Exception("簇数设置有误")
# 随机点的下标
indexes=random.sample(np.arange(0,ndarray.shape[0],step=1).tolist(),cluster_num)
points=[]
for index in indexes:
points.append(ndarray[index].tolist())
return np.array(points)
如果看不懂的话不要慌,只需知道基本的原理就足够了。实际应用过程中大多由数据或者算法部门完成计算。将需求提交给对应的部门就OK。
四.穷尽分群
截止到这,我们已经够对用户处于哪个层级,并且在他所属层级中处于什么样的“档位”有了一个清晰的判定。例如我们现在就能得到类似【一个 付费用户 且在最近30天都频繁登录并且坚持复购】的层级,似乎到这已经结束了。但往往面对诸如「如何让这部分人更活跃」或者「如何让他们更多的付费」这样的问题上,依然没有直接了当的解决方案,这里提到一个方法是:
无限分群是寻找解法的捷径
上文已经讲到,分群指的是区分用户的属性。属性包括用户的个人信息属性,包括性别、城市、年龄这些画像数据。同时也包括用户的历史行为属性,比如是否用过某个功能?是否完成了某些特殊行为?假设某个用户在前面的分群-RFM-Kmeas的过程中已经被验证是某个群体中的高价值用户,那么他是否可能因为用过的某个功能而被激励直至提升活跃?
依据这些行为上的差异,每一类用户都能找到提高用户价值的线索。
五.总结
没有数据的分层是不专业的,没有分群的分层是不完善的
上述方法贯穿了用户分层的整个路径,在实际操作中大家可以参考借鉴。
但因分层这件事本身对应的是不同的业务情况,实际操作中一定要保持批判,善于变通。
我说的,都不一定,你试试就知。
本文首发于公众号:真的不一定