数据预估的几种方法

目录

前言

一、DAU预估 with Python

1、数据准备

2、DAU预估模型

3、预估算法

二、续费系数计算 with Excel

1、概念及公式

2、续费系数计算

(1)计算公式

(2)计算说明

三、LT720的算法 with SQL

理论

总结


前言

实际业务场景中,数据分析师经常会被要求作出数据预估,已满足各式各样的需求,根据我的实际经验,本文结合案例介绍三种常用方法。


一、DAU预估 with Python

1、数据准备

创建底层表,表计算逻辑:由UU全量表计算起量至最新一天每天新增用户在最新一天的留存率。

2、DAU预估模型

预估逻辑说明

如Fig 1,其中R_0代表0天前留存率,N_0代表0天前新增,当天所有的留存和新增相乘加和便为DAU

目前的DAU预估模型根据现有留存预估偏移进行预估,该预估方式预估k天后的DAU主要需要实现几个逻辑:

  • 如Fig2 在留存率序列队尾增加k个预估的用户的长期留存R_f,目前模型中以队尾30天的平均留存计算

  • 如Fig2 在新增序列对首添加预估的新增N_f,模型中对应用户填写输入的新增

  • 将增加了预估留存率和预估新增的新留存率序列和新增序列相乘加和

通过上述逻辑,循环预估1天后~k天后的DAU

3、预估算法

记:

 -n天新增用户数为$$n_{n}$$

 -n天新增用户且当前活跃数为$$r_{n}$$

 k 天后达成DAU为$$r$$

 所需新增用户数$$n_f$$

则:

 用户n天的留存率 $$p_n=\frac{r_n}{n_n} $$

 新增用户k天后留存 $$r_n=\sum\limits_{i=1}^{k}{n_f*p_k}=n_f\sum\limits_{i=1}^{k}{p_k}$$

 存量用户k天后留存 $$r_s=\sum\limits_{j=1}^{\infty}{n_j*p_{j+k}}$$

由上两式可推出:

 $$n_f=\frac{r-\sum\limits_{j=1}^{\infty}{n_j*p_{j+k}}}{\sum\limits_{i=1}^{k}{p_k}}$$ 

 脚本代码

import pandas as pd
import datetime
from scipy import log
from scipy.optimize import curve_fit

func = {
    'logarithmic':lambda x, a, b : a * log(x) + b,
    'exponential':lambda x, a, b : x**a + b,
}
popt, pcov = curve_fit(func['logarithmic'], df['留存率'].index[1:],df['留存率'][1:])


target_dau = 31000000
future_days = (datetime.date(2020,3,31) - datetime.date(2020,3,12)).days
file_name = 'Downloads/DAU-新增日期结构_列表_20200312-20200312.csv'

def parse_csv(file_name):
    df = pd.read_csv(file_name)
    df['新增天数']=(pd.to_datetime(df['日期'],format='%Y-%m-%d')-pd.to_datetime(df['新增日期'],format='%Y%m%d')).map(lambda x: x.days)
    df = df.loc[df['新增日期'] > 20180809].sort_values(by='新增日期',ascending=False).reset_index()
    return df


def forecast_newuu_logarithmic_fitting(df, days, target_dau, asymptotic_retention_rate):
    ret_list = list(df['留存率'])+[func['logarithmic'](x ,popt[0] ,popt[1]) for x in range(len(df),len(df)+days)]
    dau_ret = sum([df['新增当日开机uu'][i]*ret_list[i+days] for i in range(min(len(ret_list)-days,len(df)))])
    dau_ret_rate = sum(ret_list[:days])
    new_uu_daily = (target_dau-dau_ret)/dau_ret_rate
    new_ret = dau_ret_rate * (target_dau-dau_ret)/dau_ret_rate
    return {
        '预期newuu': int(new_uu_daily), 
        '存量用户留存': int(dau_ret), 
        '新增用户留存': int(new_ret)
    }


def forecast_newuu_max_two_year(df, days, target_dau, asymptotic_retention_rate):
    ret_list = list(df['留存率'])+[asymptotic_retention_rate]*(730-len(df))
    dau_ret = sum([df['新增当日开机uu'][i]*ret_list[i+days] for i in range(min(len(ret_list)-days,len(df)))])
    dau_ret_rate = sum(ret_list[:days])
    new_uu_daily = (target_dau-dau_ret)/dau_ret_rate
    new_ret = dau_ret_rate * (target_dau-dau_ret)/dau_ret_rate
    return {
        '预期newuu': int(new_uu_daily), 
        '存量用户留存': int(dau_ret), 
        '新增用户留存': int(new_ret)
    }


def forecast_newuu(df, days, target_dau, asymptotic_retention_rate):
    dau_ret = sum([df['新增当日开机uu'][i]*df['留存率'][i+days] for i in range(len(df)-days)]) + sum(df['新增当日开机uu'][-days:])*asymptotic_retention_rate
    dau_ret_rate = sum(df['留存率'][:days]) 
    new_uu_daily = (target_dau-dau_ret)/dau_ret_rate
    new_ret = dau_ret_rate * (target_dau-dau_ret)/dau_ret_rate
    return {
        '预期newuu': int(new_uu_daily), 
        '存量用户留存': int(dau_ret), 
        '新增用户留存': int(new_ret)
    }


if __name__ == '__main__':
    print(forecast_newuu(df, 19, 31000000, 0.4))
    print(forecast_newuu(df, 110, 36000000, 0.4))
    print(forecast_newuu(df, 202, 41000000, 0.4))
    print(forecast_newuu(df, 294, 51000000, 0.4))
    print(forecast_newuu_max_two_year(df, 19, 31000000, 0.4))
    print(forecast_newuu_max_two_year(df, 110, 36000000, 0.4))
    print(forecast_newuu_max_two_year(df, 202, 41000000, 0.4))
    print(forecast_newuu_max_two_year(df, 294, 51000000, 0.4))
    print(forecast_newuu_logarithmic_fitting(df, 19, 31000000, 0.4))
    print(forecast_newuu_logarithmic_fitting(df, 110, 36000000, 0.4))
    print(forecast_newuu_logarithmic_fitting(df, 202, 41000000, 0.4))
    print(forecast_newuu_logarithmic_fitting(df, 294, 51000000, 0.4))

3.1、环境说明

脚本运行环境为 python3,需要 安装pandas 包

3.2

、渐进留存率asymptotic_retention_rate

预估的一个留存率,指超过一定天数后,留存率基本稳定为一个值

二、续费系数计算 with Excel

1、概念及公式

  • 续费系数: 用户续费期望

  • 预估续费系数: 以当前续费系数预估出用户未来某周(现在是计算18周)的续费系数

  • ROI(实时) = ((1*破冰价格+续费系数*续费价格) * 收益系数)/CPA
    注:目前收益系数为0.7,表示苹果商店折扣

  • ROI(预估) = ((1*破冰价格+预估续费系数*续费价格) * 收益系数)/CPA

2、续费系数计算

(1)计算公式

记第 i 次付费期望为Ei

记订阅满 i 周用户为Ai

记订阅满 i 周用户且在续费人数为Bi

总续费期望:

(2)计算说明

按week_count、purchase_uu、renewal_uu对数据表进行透视

记订阅满 i 周用户为Ai,记订阅满 i 周用户且在续费人数为Bi,计算总付费期望

 

        将续费系数做成折线图并添加拟合曲线,预估未来周的续费系数

三、LT720的算法 with SQL

理论:

1、对于满2年的渠道

n年LT = n年 内每天新增到昨天的留存率之和

2、对于满1.5年 但是不满2年的渠道

1)1年 / 1.5年 LT = 1年 / 1.5年 内每天新增到昨天的留存率之和

2)计算2年 LT 需要对不满2年的部分进行预估,预估方案:采用该渠道最前面30天的平均留存 * 0.7,作为不满两年 LT的预估值,那么最后的2年LT = 真实值 + 预估值

3、对于满1年 但是不满1.5年的渠道

1)1年 LT = 1年 内每天新增到昨天的留存率之和

2)计算1.5年 和 2年 LT时,需要进行预估,预估方案同上

4、对于满3月 但是 不满1年的渠道

1)1年 / 1.5年 / 2年 LT = 真实值 + 预估值

5、对于不满3月的渠道,不予考虑

不进行自动计算,请业务同学根据渠道的留存 对比和此渠道类似的其他渠道,比如当前渠道A留存不满3个月,渠道A留存和渠道B留存差不多,那么渠道A的LT 参考渠道B的LT。在平台上展示-

6、对于新渠道

对于新开渠道来说,前期数据量级小,数据波动大,可信度不高,对于新渠道数据,会剔除掉新增 uu < 100的数据

代码暂不公开,聪明的你肯定一听就会,若是笨蛋请收买作者。


总结

以上就是今天要讲的内容,本文简单介绍了三种数据预估的方法,除此之外,还有很多能使我们快速便捷预估数据的函数和方法。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 答案:软件可靠性预估有多种不同的方法,其中一种是使用软件建模和仿真技术,这可以帮助我们更好地了解软件的可靠性情况;另一种是使用软件质量指标,它们可以帮助我们更好地估计软件可靠性水平;还可以使用风险分析技术来预测软件可靠性;最后,还可以使用故障树分析,通过这种分析,我们可以对软件可靠性进行系统性的、定量的评估和分析。 ### 回答2: 软件可靠性预估是评估软件系统在特定条件下能够正常运行的可能性。以下是几种可以用于预估软件可靠性的好的方法。 1. 统计方法:通过对软件系统历史数据的分析,统计软件故障发生的频率和持续时间,以此来预估软件的可靠性。这种方法可以基于数据进行可靠性模型的建立和预测,但需要大量的数据来支持分析。 2. 模型方法:建立数学或统计模型,通过软件系统的结构、功能和环境等因素的考虑,来预估软件的可靠性。常见的模型方法有可靠性块图方法、故障树分析方法等。这种方法可以提供定量化的可靠性预估,但需要准确的系统参数和可靠性数据作为输入。 3. 可靠度增长方法:通过软件可靠性增长的各种技术手段,如缺陷管理、验证和测试、恢复性设计等方法,来提高软件的可靠性。这种方法适用于已有软件系统的可靠性改进,可以根据软件开发的不同阶段和需求选择相应的增长方法。 4. 利用历史经验:通过分析类似软件系统的历史数据和经验,来预估当前软件系统的可靠性。这种方法相对简单易行,可以从其他项目中提取教训和经验,以减少相似问题的再次发生。 总的来说,软件可靠性预估需要综合考虑多个因素,包括软件的特性、环境条件、开发过程和历史数据等。综合利用统计方法、模型方法、可靠度增长方法和历史经验,可以提高软件可靠性预估的准确性和可信度。 ### 回答3: 软件可靠性预估是评估软件系统在特定条件下是否能够按照预期功能正常运行的能力。为了提高软件的可靠性预估,以下是一些好的方法: 1. 使用现有的可靠性模型:可靠性模型是通过对软件中的错误、故障和失效进行建模和分析来预测其可靠性的工具。常用的模型包括故障树分析(FTA)、可靠性块图(RBD)、Markov模型等。通过选择适合特定软件类型和开发阶段的模型,可以有效评估软件的可靠性。 2. 统计测试数据分析:通过收集和分析软件的测试数据,可以识别出软件中的常见问题和故障模式。例如,可以使用故障跟踪系统来记录和分析软件中的错误,并根据错误的出现频率和影响程度来评估软件的可靠性。 3. 使用静态和动态代码分析工具:静态代码分析工具可以检测代码中的潜在问题,如空指针引用、不兼容类型等,从而提前发现并修复潜在的错误。动态代码分析工具可以在运行时监测和分析软件的行为,识别出可能导致软件故障的问题。 4. 进行系统级测试:在软件开发过程中进行系统级测试可以模拟实际使用环境中的各种情况和负载条件,检验软件在实际条件下的可靠性表现。例如,可以进行负载测试、冒烟测试等来评估软件在高负载和异常情况下的可靠性。 5. 采用迭代和增量开发模型:通过将软件开发过程划分为多个迭代和增量,可以及早发现和解决软件中的问题,提高软件的可靠性。同时,迭代和增量开发模型还可以更好地应对需求的变化和不确定性。 综上所述,通过使用可靠性模型、统计测试数据分析、静态和动态代码分析工具、系统级测试以及采用迭代和增量开发模型等方法,可以提高软件的可靠性预估
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值