数据分析的顶级思维
张旭本职工作是台湾高数课外补习班老师,因为把自己的教学视频传到了全球最大的成年人网站Pxxxhub,而意外收获了众多国内外高数学习者的关注。看似很荒唐的事情,背后却隐藏着这位数学老师强大的逻辑思维。刚开始录制网络视频是为了招生,但他把视频发在YouTube和Facebook上没有带来多少点击量,因为教培界内卷太严重,这类网站关于高数的教学视频太多。
上传到Pxxxhub不仅能博眼球,关键是Pxxxhub的核心用户就是年轻的大学生,这正是张旭的潜在客户,这两者高度重合。所以张旭的另类做法收到了出圈的效果,一年时间在P站上传了200多部作品,卖网课一年赚到750万新台币(约172万人民币),不光养活自己,还请了好几个员工运营频道。
引言
重合率其实就是另一个角度的相关性分析,最经典的案例是啤酒和尿布。真正的相关性分析其实也很简单,改天单独写一篇。今天只说一下重合率计算问题。
本文解决两个事情:
- 矩阵重合率计算
- 矩阵中的最大最小值突出显示
全文共2600字,预计阅读时间8分钟。
提出问题
用矩阵计算各个平台的会员重合率,比如平台A有10个值,平台B有5个值,双方重复2个,就是用重合数据2/(10+5-2)
数据表:
目标:
详细解答
第一步:
确定大方向:一定是用矩阵呈现,且需要两个会员平台的维度表。
这一点,我在上一篇文章(这里)中详细说过原因,用的是两章时间表。
因此先来生成两个维度表:
平台1 = VALUES(userdata[会员平台])
平台2 = '平台1'
并建立一对多关系:
拖到报表中的行与列:
第二步:
计算任意两个平台之间的交叉会员的个数:
SHARE =
var p1=CALCULATETABLE(VALUES(userdata[会员用户名]),ALL('平台2'))
var p2=CALCULATETABLE(VALUES(userdata[会员用户名]),ALL('平台1'))
var share= INTERSECT(p1,p2)
return COUNTROWS(share)
思路与复购是完全一致的,使用的都是INTERSECT函数,同时注意ALL的使用:
当然,要注意的一点是,其实从左上到右下的这条线上的数据无意义,因为它本身就表示同一个平台的会员数量。
第三步:
计算交叉会员个数占两个平台会员总和的百分比。
这个度量值基本上就是由上面第二步接着往下写了:
SHARE% =
var p1=CALCULATETABLE(VALUES(userdata[会员用户名]),ALL('平台2'))
var p2=CALCULATETABLE(VALUES(userdata[会员用户名]),ALL('平台1'))
var share= INTERSECT(p1,p2)
var share_percent=DIVIDE(COUNTROWS(share),COUNTROWS(p1)+COUNTROWS(p2)-COUNTROWS(share))
return if(share_percent<1,share_percent,BLANK())
两个平台的会员总和用的是SHARE/(P1+P2-SHARE),这是最简单的写法。
其实对于DIVIDE的分母我们还可以这样写:
COUNTROWS(DISTINCT(UNION(p1,p2)))
甚至通过复杂度量值写出or的条件,我们就不赘述了。
另外,从左上到右下的这条线上的这些数必定是100%,我们就直接用if变空白了。 结果如下:
这样基本的结果就出来了。
第四步:
空白的位置填充为灰色。
我们可以用度量值的条件格式来实现,设置如果值为空,则背景色为灰色:
显示效果:
到这里基本上就结束了。
此时,用户提出了更高的要求:
重合度最高的标红色
安排!
第五步:
矩阵中的数据值最大的标红色,这个需求非常落地,在错综复杂的表格中,我们往往需要用户第一眼就能看到最大值和最小值,尤其是这种矩阵中每一列的数据是同一层级的情况。
思考:矩阵是二维的展示,不可能直接获取最大、最小值。因此一定要将二维矩阵变为一维的表格去计算,因为表格和矩阵只不过是透视和逆透视的关系。
我们将矩阵变为表,再按照从大到小的顺序排列:
(这个表同样也是虚拟表中要构建的表)
这样就能求出重合度最高的值。
但是度量值在每一个格子里只能取一个值,而不知道其他筛选器下的值,也就是它根本不知道自己是不是最大值或最小值。
那么这个问题必然是通过创建一个虚拟表的方式来实现:
思路:
在虚拟表中建立如上图所示的表,然后获取share%的最大值value_max,这个value_max是不随着筛选器改变而变化的,再用这个value_max和真实的表中的被两个筛选器筛选的share%值对比,两者相等的话,那么这个share%就是最大值,也就是要标红的值。
步骤:
- 使用CROSSJOIN获取两组平台的笛卡尔积,建立虚拟表;
- 在虚拟表上逐行扫描计算每一行的share%;
- 求出这张虚拟表上的share%最大值value_max;
- 逐行扫描这张虚拟表,如果share%=value_max,返回1,否则为空。
value.MAX =
var share_table=
CALCULATETABLE(
ADDCOLUMNS(
CROSSJOIN(
VALUES('平台1'[会员平台]),
VALUES('平台2'[会员平台])
),
"share%",
[SHARE%]
),
ALLSELECTED()
)
var value_max=MAXX(share_table,[share%])
VAR is_value_max=IF([SHARE%]=value_max,1)
RETURN is_value_max
我们再用条件格式来设定一下:
最终结果:
结论
本文通过一个计算多个平台会员重合率的问题,讲解了遇到此类问题时的建模方法、INTERSECT函数的使用、条件格式的设置,同时本文也对比区分了表和矩阵的区别,以及最重要的:如何在矩阵中将最大值和最小值进行醒目的标注。
就像最后这张图一样,简单的一个度量值加上条件格式标注,可以显著提高报告的可用性。因此,任何时候,我们都需要站在报告使用者的角度,深入地思考问题,为他们提供最大的便利,为业务提供最优的支持。
就像文章开头所引用的新闻,在P站放微积分课程是因为这两者的受众高度重合,啤酒+尿布的各种组合也成为了市场营销中强有力的手段,而这些都是为了获取更清晰的用户画像,方便给客户推荐更多的产品。
这就是数据分析。