App活跃用户量预测

本文介绍了预测App活跃用户量的方法,通过建立假设、利用留存率曲线和计算公式,预测不同新增用户量下的活跃用户数。文章提供了一个具体的场景,并展示了如何应用公式计算每日活跃用户量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

App活跃用户量预测

工作中可能会遇到这种情况,在做投放规划时,需要确定在不同DNU(每日新增用户)下,在不同日期时所能达到的活跃用户量。这种情况下,笔者采取了这种方法进行预估。大家可以一起探讨。

首先建立一些假设:
  • 假定预计新增用户流失规律,符合之前用户不同次留对应的流失曲线。
  • 起始用户不同app年龄层的用户也符合选定的次留流失曲线
  • 流失(留存)曲线在x天后不再发生变化
计算方法
以上假设所依赖的留存率曲线
  • 实际测算时可采用实际app之前的留存曲线下图的留存曲线来源于网上一篇文章:https://blog.csdn.net/vinking934296/article/details/64906861,假设200天后该曲线对应的留存率不再发生变化。拟合曲线公式为:

y = − 0.055 l n ( x ) + 0.6382 y = -0.055ln(x)+0.6382 y=0.055ln(x)+0.6382

在这里插入图片描述

起始用户的留存

根据活跃用户的app年龄,结合流失曲线进行预估后汇总得某日后活跃用户的留存量,汇总当日的新增后得当日的活跃用户量。比如1月31日的活跃用户中有100个1月1日注册的用户,根据流失曲线计算这100个用户在注册后第32天的剩余量计入2月1日的活跃用户,依次类推。
D A U i = D O U i + D N U i                  ① DAU_i = DOU_{i}+DNU_i \ \ \ \ \ \ \ \ \ \ \ \ \ \ ① DAUi=DOUi+DNUi               

D O U i = A g e 0 → 1 + A g e 1 → 2 + A g e 2 → 3 + . . . .           ② DOU_{i} = Age_{0\to1}+Age_{1\to2}+Age_{2\to3}+.... \ \ \ \ \ \ \ \ \ ② DOUi=Age01+Age12+Age23+....         

A g e ( i − 1 ) → i = A g e i − 1 / R e t e n t i o n i − 1 ∗ R e t e n t i o n i          ③ Age_{(i-1)\to i}=Age_{i-1}/Retention_{i-1}*Retention_i \ \ \ \ \ \ \ \ ③ Age(i1)i=Agei1/Retentioni1Retentioni        

设定场景

2020年12月31日的DAU为7797,活跃用户的app年龄分布见下表。市场推广部门如果在1-6月份,每月每日带来3000左右的用户,那么在2021年7月1日时这款app的活跃用户量是多少?

image-20210619131335818

利用公式,我们可以计算一下,2021年1月1日时的活跃用户量计算表格如下

依此类推可以计算第n天时的活跃用户量,计算逻辑如上。以下为计算代码可以供大家参考:

  • 设计函数计算在有起始用户数,留存率及每日预计新增的用户数,选用的留存率曲线对应的次日留存,设置第多少天后留存率不再发生变化.
def cal_days_num(data_start_dict,live_rate_dict,dnu_list,r2_list,n_days,live_rate_limit = 396):
    '''
    输入开始人数字典,对应次留字典,每日新增人数,n_days:要查看的天数
    data_start_dict:起始人数
    live_rate_dict:存储不同次留对应的留存曲线
    dnu_list:存储每天对应的新增
    r2_list:存储每天对应的次留
    n_days:记录要查看的天数
    live_rate_limit:是指第几天后留存不再发生变化,默认为第90天,取值为(90-1)89
    :return: 前n_days天的每日的明细及汇总新增数据。
    '''
    day_live_num = []
    day_dict = {
   }
    for i in  range(n_days):
        age_num = []
        age_live_num = []
        try:
            num_0 = data_start_dict[0]
        except:
            num_0 = dnu_list[i]
        data_start_dict.update({
   0:num_0})
        ##one days
        num = dnu_list[i]
        age_num.append(0)
        age_live_num.append(num)
        new_data_start = {
   }
        for age_value in data_start_dict:
            if age_value >live_rate_limit:
                live_num = data_start_dict[age_value]
                num += live_num
                new_data_start.update({
   age_value+1:live_num})
            else:
                data_live_dict = live_rate_dict[r2_list[i]]
                live_num = data_start_dict[age_value] / data_live_dict[age_value] * data_live_dict[age_value+1]
                num += live_num
                new_data_start.update({
   age_value+1:live_num})
            age_num.append(age_value+1)
            age_live_num.append(live_num)
        data_start_dict = new_data_start
        day_dict.update({
   i:[age_num,age_live_num]})
        day_live_num.append(num)
    return day_dict,day_live_num
  • 实际应用中可以用文本形式生成,需要输入的参数,这里为方便大家尝试,我们直接在代码中生成

    ##起始用户年龄
    data_start = pd.DataFrame({
         'days': {
         0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22}, 'users': {
         0: 400, 1: 387, 2: 374, 3: 361, 4: 348, 5: 335, 6: 322, 7: 309, 8: 296, 9: 283, 10: 270, 11: 257, 12: 244, 13: 231, 14: 218, 15: 205, 16: 192, 17: 179, 18: 166, 19: 153, 20: 140, 21: 127}})
    ##生成起始用户年龄的字典(data_start_dict)
    data_start_dict = dict(zip(data_start.days,data_start.users))
    
    ##用户使用的留存曲线表:
    live_rate = pd.DataFrame(
    {
         'days': {
         0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值