基于月度用户数据透视表,计算企业新增用户的平均时长
计算企业用户增长各阶段的平均耗时解决方案
嘿,这个需求我之前帮朋友处理过类似的,咱们一步步拆解来搞定它~
核心逻辑先理清楚
你要的是从k个用户增长到k+1个用户的平均耗时,本质上就是找每个企业首次达到k+1用户的月份,减去它首次达到k用户的月份,然后把所有企业的这个差值取平均。
第一步:把宽表转成“长格式”(关键第一步!)
你的原始数据是宽表(每列对应一个月份),这种格式不方便追踪用户数随时间的变化,得先转成“长格式”——也就是每行对应一个企业的某一个月份的用户数,结构变成:ID | 月份 | 用户数。
举个例子,假设企业ID=1的第0月用户数0,第1月0,第2月1,第3月2,转成长格式后就是:
- 1 | 0 | 0
- 1 | 1 | 0
- 1 | 2 | 1
- 1 | 3 | 2
实操方法:
- 如果你用Excel:直接用Power Query的「逆透视列」功能,选中所有“第X月”的列,右键选逆透视,自动就转成窄表了,还能顺便把“第X月”的文字转成数字月份。
- 如果你用Python pandas:用
melt函数搞定,代码大概是这样:
import pandas as pd # 假设你的原始宽表叫df_wide,第一列是ID,其他是第0月、第1月... df_long = pd.melt(df_wide, id_vars='ID', var_name='月份', value_name='用户数') # 把“第X月”的字符串提取出数字月份 df_long['月份'] = df_long['月份'].str.extract('(\d+)').astype(int)
第二步:提取每个企业首次达到各用户数的月份
接下来,我们要给每个企业找出第一次达到某个用户数k的最早月份——毕竟重复的用户数记录(比如连续3个月都是1个用户)对我们没用,只需要第一次出现的时间点。
还要注意:如果某个企业的用户数出现下降(比如从2降到1),这种情况我们直接忽略,因为我们关注的是从0→1→2...的正向增长路径。
实操代码(pandas为例):
# 先按企业ID和月份排序,保证时间顺序正确 df_sorted = df_long.sort_values(['ID', '月份']) # 去重:每个企业+用户数组合,只保留第一次出现的月份 df_first_reach = df_sorted.drop_duplicates(subset=['ID', '用户数'], keep='first') # 过滤掉用户数下降的记录,只保留增长/持平的(持平的已经去重了,其实这里主要是过滤下降) df_first_reach = df_first_reach.groupby('ID').apply( lambda x: x[x['用户数'].diff().fillna(1) >= 0] ).reset_index(drop=True)
第三步:计算每个增长阶段的耗时
现在,每个企业的记录都是按用户数递增排列的首次达到时间,接下来只要计算相邻两个用户数之间的月份差,就是这个增长阶段的耗时了。
比如某企业的记录是:
- ID=1 | 月份0 | 用户数0
- ID=1 | 月份2 | 用户数1
- ID=1 | 月份5 | 用户数2
那0→1的耗时就是2-0=2个月,1→2的耗时是5-2=3个月。
实操代码:
# 按企业分组,计算每个阶段的耗时 df_stages = df_first_reach.groupby('ID').apply(lambda x: pd.DataFrame({ '用户增长阶段': [f"{x['用户数'].iloc[i]}→{x['用户数'].iloc[i+1]}" for i in range(len(x)-1)], '耗时(月)': x['月份'].diff().dropna().values })).reset_index(level=1, drop=True).reset_index()
第四步:计算各阶段的平均耗时
最后一步就简单了,把所有企业的同阶段耗时取平均值就行:
avg_stage_time = df_stages.groupby('用户增长阶段')['耗时(月)'].mean().reset_index()
出来的结果就是每个阶段的平均耗时,比如0→1平均耗时1.2个月,1→2平均耗时2.5个月之类的。
特殊情况的小提醒
- 如果某个企业直接从0跳到2(比如第0月0,第1月2),这种情况怎么处理?比如你可以把它拆成0→1耗时0个月,1→2耗时1个月;或者视为0→2耗时1个月,然后按阶段拆分平均——这个得根据你的业务定义来调整,比如如果业务上认为“跳过的阶段也算在总耗时里”,那可以按后者处理。
- 对于那些还没增长到某个用户数的企业(比如最多只有3个用户),它们不会参与4→5及更高阶段的平均计算,这是合理的,因为这些企业还没走完那个阶段。
内容的提问来源于stack exchange,提问作者rdbgnv




