在做产品的时候,我们希望是数据驱动的。**一个产品的用户天花板(最大DAU)是指导产品的重要指标。**问题来了,如何估计一个产品的DAU?给出解决方案,这是本文解决的主要问题。
一、估计最大DAU
首先,一个产品的活跃用户可以分为两部分,第一部分是当天的新增天用户,第二部分是产品之前的存留用户。这两部分与DAU大致的关系如下:
D
A
U
(
n
)
=
A
(
n
)
+
A
(
n
−
1
)
R
(
1
)
+
A
(
n
−
2
)
R
(
2
)
+
…
…
+
A
(
1
)
R
(
n
−
1
)
DAU(n)=A(n)+A(n-1)R(1)+A(n-2)R(2)+… …+A(1)R(n-1)
DAU(n)=A(n)+A(n−1)R(1)+A(n−2)R(2)+……+A(1)R(n−1)
其中, D A U ( n ) 为 DAU(n)为 DAU(n)为第n天的日活, A ( n ) A(n) A(n)为第n天的新增, R ( n − 1 ) R(n-1) R(n−1)为新增用户在第n-1天后的留存率。
将问题简化一下,假设
A
(
n
)
A(n)
A(n)即每日新增用户是一个常数,这在产品平稳运行时是一个合理的假设。于是上面公式变为下面形式:
D
A
U
(
n
)
=
A
(
1
+
R
(
1
)
+
R
(
2
)
+
…
…
+
R
(
n
−
1
)
)
DAU(n)=A(1+R(1)+R(2)+… …+R(n-1))
DAU(n)=A(1+R(1)+R(2)+……+R(n−1))
A A A每日新增用户,我们可以通过统计的方式很容易得到。重点是我们如何估计每日的存留 R ( k ) R(k) R(k)。
假设我们有下面的数据:
第一列时间代表第k天前,即
R
(
k
)
R(k)
R(k)中的
k
k
k。第二列存留率表示对应时间的用户存留
R
(
k
)
R(k)
R(k)。对应走势如下:
由于数据不全,我们需要使用现有数据对每一天的存留进行估计,最长用的方式就是使用回归对曲线进行拟合,对曲线形态进行观察,夹着存留与时间存在如下关系:
R
=
C
e
−
a
x
R = Ce^{-ax}
R=Ce−ax,其中x是时间,R是存留率。于是上面DAU的估计公式变成如下形式(求和变为积分):
D
A
U
(
n
)
=
A
(
1
+
R
(
1
)
+
R
(
2
)
+
…
…
+
R
(
n
−
1
)
)
=
A
∗
∫
0
n
C
e
−
a
x
d
x
DAU(n)=A(1+R(1)+R(2)+… …+R(n-1))=A*\int_0^nCe^{-ax}\operatorname dx
DAU(n)=A(1+R(1)+R(2)+……+R(n−1))=A∗∫0nCe−axdx
实际上,并不去要真正的求上面积分,因为在极限理论中:
D
A
U
(
n
)
=
A
∗
C
∗
1
/
a
DAU(n)=A* C * 1/a
DAU(n)=A∗C∗1/a
接线来就是求C和a了,由于
R
=
C
e
−
a
x
R = Ce^{-ax}
R=Ce−ax并不是很好估计,我们对两边同时取对数,可以将其变为线性形式:
l
n
(
R
)
=
l
n
(
c
)
−
a
x
ln(R)= ln(c)-ax
ln(R)=ln(c)−ax
这就是最简单的线性回归了,
l
n
(
c
)
ln(c)
ln(c)是截距项。对参数
l
n
(
c
)
ln(c)
ln(c)和
a
a
a进行估计后,我们进行一下转换直接带入下面公式就好啦。
D
A
U
(
n
)
=
A
∗
C
∗
1
/
a
DAU(n)=A* C * 1/a
DAU(n)=A∗C∗1/a
二、估计最大DAU的python实现
我们假设我们每日的新增用户为
A
=
100
w
A=100w
A=100w,统计到的存留数据如下:
我们编写程序计算最大的DAU
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 10:01:17 2020
@author: nbszg
"""
import numpy as np
import pandas as pd
import scipy.stats as st
import statsmodels.api as sm #最小二乘
from statsmodels.formula.api import ols #加载ols模型
import matplotlib.pyplot as plt
r = [0.72, 0.57, 0.33, 0.18, 0.08]
t = [1, 3, 30, 90, 140]
data = pd.DataFrame()
data['时间'] = t
data['存留率'] = r
A = 1000000
def max_DAU(A, remain, t):
'''
计算最大DAU
Args:
A: 每日新增用户数
remain: 各时间存留率
t: 各时间存留率对应时间
return:
最大DAU
'''
remain_data = pd.DataFrame(np.array([remain, t]).T, columns = ['remain', 't'])
#进行对数变换
remain_data['ln_remain'] = np.log(remain_data['remain'])
lm=ols('ln_remain ~ t',data=remain_data).fit()
#print(lm.summary())
#得到C
C = np.exp(lm.params['Intercept'])
#得到a
a= -lm.params['t']
DAU = A*C/a
print("预估产品最大DAU为:{}".format(DAU))
return DAU
max_DAU(A, data['存留率'], data['时间'])
得到结果为产品的最大DAU为:42526684人