You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python复现R语言实现的月度客户留存率(CRR)计算方案

Python复现R语言月度客户留存率(CRR)计算方案

前置依赖

实现基于pandas库,未安装可执行pip install pandas完成安装。

完整实现代码

导入依赖

import pandas as pd

构造示例数据(和原方案样本一致)

year_mon = ["2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", "2018 Nov", 
            "2018 Dec", "2018 Dec", "2018 Dec", "2019 Jan", "2019 Jan", 
            "2019 Feb", "2019 Feb", "2019 Feb"]
customer_id = [1, 2, 3, 4, 5, 2, 3, 4, 3, 4, 1, 2, 3]
dat = pd.DataFrame({"customer_id": customer_id, "year_mon": year_mon})

生成中间计算表

# 转换年月为当月1号的日期格式
dat["Date"] = pd.to_datetime(dat["year_mon"] + " 01", format="%Y %b %d")
# 丢弃冗余字段、按日期排序
dat2 = dat.drop("year_mon", axis=1).sort_values("Date").reset_index(drop=True)
# 按客户ID分组计算标记字段
# stayed:用户是否为上月留存用户
dat2["stayed"] = dat2.groupby("customer_id")["Date"].transform(
    lambda x: [False] + list(x.dt.to_period("M").diff().dropna() == pd.DateOffset(months=1))
)
# notnew:用户是否不是首次消费
dat2["notnew"] = dat2.groupby("customer_id")["Date"].cumcount() != 0

计算月度CRR结果

crr_result = dat2.groupby("Date").agg(
    n_customers=("customer_id", "count"),
    n_stayed=("stayed", "sum"),
    n_new=("notnew", lambda x: sum(~x)),
    n_returned=("notnew", "sum")
).reset_index()
# 计算上月用户数和CRR值
crr_result["prev_n_customer"] = crr_result["n_customers"].shift(1)
crr_result["CRR"] = 100 * crr_result["n_stayed"] / crr_result["prev_n_customer"]

结果说明

输出crr_result即可得到和原R方案完全一致的计算结果,首月无上月用户数据,CRR为空符合业务逻辑。

内容的提问来源于stack exchange,提问作者pdw5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:57:00