更多商业数据分析案例(原理,完整代码,数据集)、统计学、SQL、网络爬虫详见公众号 " 数据分析与商业实践 "
引言
同期群分析的目的在于透过现象找到结果,以时间维度建立同期群,除按时间维度考虑,也可以对来源渠道等维度建立同期群。是一个很不错的数据分析思路与方法。
通过查看用户的后续活跃、留存、访问内容等相关数据,找出有效用户的影响因素。
同期分析作用一览
实际案例:9月份新增用户10万人,10月份新增用户15万人,但9月份新增用户的30日留存用户为1万人,10月份新增用户的30日留存用户也为1万人,哪个月的运营业绩更好呢?我的这次促销是否有提前透支口碑呢?同期分析结果需要结合业务实际,一些业务思维的培养放在了文末链接,本篇专注于用 Python 来实现同期分析,尽管目前有工具可专门实现,但用 Python 也来一次,可以训练代码手感和思路,往下看吧。
通过横向对比,能够对客户留存和生命周期有初步的认识。基于纵向观察,可以发现不同期客户,留存情况的差异,以反推该期引入的客户是否精准。
数据清洗
构建同期分析表
以单独的一个时间为例,为后续构建大循环做准备
循环构建
看似很简单,只是把刚才的示例结合起来罢了,但中间也有值得注意的地方
输出结果,有了等于号线和横杠线配合换行的确会整洁不少
动态数据可视化&结果分析
-
横向观察,次月流失严重,表现最好的月份次月留存也只有12%,随后平稳降低,稳定在6%左右。
-
纵向对比,2019年当月新增客户最少,仅有2042位,但人群相对精准,留存率表现优于其他月份。
关键代码呈现
# 存储每月新增的客户数
monthly_increase = {} # 用字典存储,格式输出漂亮些,也有助于添加进 DataFrame 中
# 由上面的时间可知,范围为:2019-09 ~ 2020-02:最多也就加五个月
# 循环对每个月进行上述相同的求解操作,注意第一个月不需要进行操作
## 注:在进行大小循环的过程中,可以跟之前的样本数据结果进行比对,简单验证一下
for i in range(len(month_list)):
print(f'正在对{month_list[i]}进行操作...')
print('-'*50)
# 求解该月的订单数量和客户数量
orders = df[df['付款时间'] == month_list[i]]
# 将客户分组,即把多次下单的同一个客户算为一个客户:根据暱称来 groupby
customers = orders.groupby('客户暱称')['支付金额'].sum().reset_index()
print(f'{month_list[i]}的订单数量为:{len(orders)},客户数量为:{len(customers)}')
# --------------------- 计算每月新增客户数 -------------------------------
# 如果是第一个月份,则跳过,毕竟不需要和历史数据验证是否为新客户
# 这也是 for 循环的 range() 中为什么不是month_list而是添加了长度的len(month_list)
if i == 0:
print('该月是数据集中的第一个月份,不需要和历史数据验证是否为新客户')
# 这里的新增只是为了格式上一致,毕竟第一个月算什么新增
monthly_increase[month_list[i]] = len(customers)
else: # 如果不是,需要找到之前的历史订单
# print('该月不是数据集中的第一个月份,正在匹配历史数据...')
print(f'该月({month_list[i]})的历史年月为:{", ".join(month_list[:i])}')
# 历史订单,从原始数据集中进行比对
history = df[df['付款时间'].isin(month_list[:i])]
# 新增客户:未在历史订单中出现过的客户
new_customers = customers[~customers['客户暱称'].isin(history['客户暱称'])]
print(f'本月新增客户数为:{len(new_customers)}')
monthly_increase[month_list[i]] = len(new_customers)
# --------------------- 计算每月留存客户数 -------------------------------
print('正在计算', ", ".join(month_list[i+1:]), '中每个月份的客户留存数...')
print('-'*50)
for j in range(i+1, len(month_list)):
# print(f'正在计算{month_list[j]}的留存客户数...')
next_month = df[df['付款时间'] == month_list[j]]
retention_c=customers[customers['客户暱称'].isin(next_month['客户暱称'])]
print(f'{month_list[j]}的留存客户数:{len(retention_c)}')
print('='*50 + '\n')
学会提问 | 个人爆发式成长 | 寻找零售密码
一句话成为心上人特别的存在
参考
大神极简实现