数据分析系列:如何估计一个产品用户最大量(最大DAU)——附python计算代码

在做产品的时候,我们希望是数据驱动的。**一个产品的用户天花板(最大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(n1)R(1)+A(n2)R(2)++A(1)R(n1)

其中, D A U ( n ) 为 DAU(n)为 DAU(n)第n天的日活, A ( n ) A(n) A(n)为第n天的新增, R ( n − 1 ) R(n-1) R(n1)为新增用户在第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(n1))

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=Ceax,其中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(n1))=A0nCeaxdx

实际上,并不去要真正的求上面积分,因为在极限理论中:
在这里插入图片描述
D A U ( n ) = A ∗ C ∗ 1 / a DAU(n)=A* C * 1/a DAU(n)=AC1/a

接线来就是求C和a了,由于 R = C e − a x R = Ce^{-ax} R=Ceax并不是很好估计,我们对两边同时取对数,可以将其变为线性形式:
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)=AC1/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人

### 如何在面试中准确估算和表达项目规模 #### 用户量的估算与表达 用户量通常可以通过活跃用户的数量来衡量,比如日活用户DAU)、月活用户(MAU)。对于一个网盘类应用而言,假设其拥有约 **100万注册用户**,其中每日有 **20% 的用户活跃** 使用,则 DAU 大约为 20 万。此外,还可以通过分析用户行为模式进一步细化,例如平均每位用户每天发起多少次请求[^1]。 #### 接口 QPS 的估算与表达 QPS 是指每秒钟服务器能够处理的请求数量。根据引用内容提到的信息,在高并发场景下近似值为 2667,并考虑一定的缓冲因子后终达到大约 3200 左右[^3]。因此,在描述时可以说:“该项目高峰期接口 QPS 达到约 3200”,这已经包含了安全余量的设计思路。 另外需要注意区分不同类型的 QPS 定义——当涉及数据库层面的操作时,“Query Per Second”仅统计 SELECT 查询而不含写入动作;而对外提供服务端 API 层面则可能涵盖读取加修改等多种类型调用[^2]。 #### 数据库数据量级的估算与表达 针对数据库部分,可以从以下几个维度来进行说明: - 如果采用关系型数据库存储文件元信息(如名称、大小、路径等),考虑到平均每名用户上传若干GB级别的资料并经过去重优化之后保留下来的有效记录数目会有所减少。按照前述例子中的百万级别用户基数推测,整个表单可能会累积至千万甚至上亿行记录范围之内。 - 对于非结构化的大对象存储需求来说,实际占用空间取决于具体业务模型设定的最大限额标准以及压缩算法效率等因素影响下的总体容量规划情况。不过这些并不直接体现在传统意义上的“数据量”概念里头。 综上所述,在阐述过往经历里的技术挑战及其解决方案过程中,可以这样总结道: > “我们所负责维护运营的一个私有云端存储平台服务于超过一百万名个人客户群体,日常运行期间峰值时刻所能承受住外部访问压力高达三千多次/秒以上水平线近波动变化不定的状态之中运转良好无明显卡顿现象发生;与此同时内部核心组件之一即关联着各类重要属性字段组成的庞大关系链路体系内保存下来的实体实例总数也早已突破数千万关口。” --- ### 示例代码片段展示逻辑清晰度提升技巧 以下是关于如何利用 Python 编程语言模拟简单版流量监控工具的小例子供参考学习之用: ```python import time def simulate_traffic(qps, duration_seconds): total_requests = qps * duration_seconds start_time = time.time() request_count = 0 while True: current_time = time.time() if (current_time - start_time) >= duration_seconds: break # Simulate handling one request per iteration. request_count += 1 elapsed_time = current_time - start_time estimated_qps = request_count / elapsed_time if elapsed_time > 0 else 0 print(f"Elapsed Time: {elapsed_time:.2f}s | Total Requests Handled: {request_count} | Estimated QPS: {estimated_qps:.2f}") simulate_traffic(3200, 5) ``` 此脚本可以帮助直观理解给定时间内系统能支持多大程度上的负载能力测试结果反馈机制运作原理等方面的知识要点所在之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值