魔法数字(二)——通过python 中的kneed包找到拐点的方法
最近半年多懒于更新,但是心想做事情还是不能半途而废,于是就觉得应该把之前挖的坑填上~
上文(《 恒沙数:魔法数字浅谈 》)介绍, 魔法数字实际上是一种条件概率:即“用户完成或者超越某一个行为阈值之后就一定会留存的条件概率”。 当我们绘制出条件概率图表之后,只要能够找到条件概率曲线的拐点,就找到了魔法数字。当然,找拐点的过程,我们大可拍脑袋来决定,但是这样过于主观而且由于没有标准化的流程不可复现。那么如何自动、量化地找到拐点呢?
如果条件概率曲线是一条光滑的连续曲线,我们可以直接通过求取曲线的曲率来找到拐点——也就是曲率最大的点。 如果是曲线并不连续光滑,而是一条曲折、离散的曲线,我们则需要从曲线的形状进行分析找到拐点(比如角度法、Menger curvature等)。这些方法在某些程度上 都和曲率或者某种转角有关。由于本文不是着重于介绍理论,所以在此不一一赘述了,有兴趣的同学可以通过这篇文献去了解——《Finding a “Kneedle” in a Haystack: Detecting Knee Points in System Behavior》(有需要可以私信我)
在python 中有一个自动帮助我们寻找拐点的包,叫kneed。这个包中只需要定义少量的参数(如凹凸性以及趋势上升还是趋势下降),就可以自动地帮助我们找到一条曲线中的拐点。
1.通过一个小例子来看kneed如何帮助我们找到魔法数字
我们可以通过如下代码安装kneed:
pip install kneed
我们还是通过我在上一篇文章《 恒沙数:魔法数字浅谈 》所介绍的虚拟数字案例来熟悉kneed的操作——《某APP注册用户添加好友及留存数据》
首先,我们导入寻找魔法数字拐点所需要的模块和函数:
import numpy as np
from kneed import KneeLocator ##寻求拐点位置的函数
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import style
style.use('seaborn-whitegrid')
然后我们再读入数据集(如果需要可以私信找我要哈~~):
###导入魔法数字数据集
magic_data=pd.read_csv("/Users/zengcan/Desktop/魔法数字案例.csv")
magic_data
此时我们可以看到我们的数据集有三列,“新注册10天内加好友数”,“人数”(加n个好友对应的人数),(加n个好友的新注册用户数中)“90日内留存人数”:

如上文(《 恒沙数:魔法数字浅谈 》)介绍,魔法数字实际上是求的条件概率曲线的拐点,所以我们需要利用如下代码将上面这个数据集处理成条件概率的形式:
###对魔法数字进行计算
magic_data['加好友数大于等于i人的UV']=[magic_data['人数'][i:magic_data.shape[0]].sum() for i in magic_data.index]
magic_data['加好友数大于等于i人的留存UV']=[magic_data['90日内留存人数'][i:magic_data.shape[0]].sum() for i in magic_data.index]