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

如何计算月度客户流失率并绘制跨年度时间序列图?

月度客户流失率计算与时间序列图实现

前提假设

首先明确数据逻辑(基于你提供的字段):

  • 每条记录对应一个客户,start_date为客户流失日期(仅当Boolean=True时有效,代表客户在该日期所属月份流失);Boolean=False表示客户从未流失,始终活跃。
  • 月度期初活跃客户数 = 从未流失的客户总数 + 流失日期晚于当前月份的客户数(即当月初仍未流失的客户)。
  • 月度流失客户数 = 当月内流失的客户量(Boolean=True且start_date落在当月的客户数)。

实现步骤(Python)

用Pandas处理数据,Matplotlib/Seaborn绘图,完整代码如下:

1. 数据预处理

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据(替换为你的数据源路径)
df = pd.read_csv('customer_data.csv')

# 转换日期格式,提取年月用于分组
df['start_date'] = pd.to_datetime(df['start_date'])
df['churn_month'] = df['start_date'].dt.to_period('M')  # 格式如2023-01

2. 统计月度流失客户数

# 筛选已流失客户,按月份统计数量
monthly_churn = df[df['Boolean'] == True].groupby('churn_month')['Boolean'].count().rename('churn_count')

3. 计算月度期初活跃客户数

先生成数据覆盖的完整月度序列,再逐个计算每月初的活跃客户量:

# 生成数据包含的所有月份
all_months = pd.period_range(
    start=df['start_date'].min().to_period('M'),
    end=df['start_date'].max().to_period('M'),
    freq='M'
)

# 初始化存储期初活跃数的Series
monthly_active_start = pd.Series(index=all_months, dtype=int)

# 遍历每个月份计算活跃客户数
for month in all_months:
    # 期初活跃 = 从未流失的客户 + 流失月份晚于当前月的客户
    active_count = len(df[(df['Boolean'] == False) | (df['churn_month'] > month)])
    monthly_active_start.loc[month] = active_count

monthly_active_start = monthly_active_start.rename('active_start_count')

4. 计算流失率并整合数据

# 合并数据,填充缺失值(无流失的月份补0)
churn_rate_df = pd.concat([monthly_churn, monthly_active_start], axis=1).fillna(0)

# 计算流失率,避免除以0的情况(除数为0时标记为NaN)
churn_rate_df['churn_rate'] = churn_rate_df['churn_count'] / churn_rate_df['active_start_count'].replace(0, float('nan'))

# 将Period索引转为datetime,方便绘图
churn_rate_df.index = churn_rate_df.index.to_timestamp()

5. 绘制时间序列图

plt.figure(figsize=(12, 6))
sns.lineplot(data=churn_rate_df, x=churn_rate_df.index, y='churn_rate', marker='o', color='#2ecc71')

# 设置图表样式
plt.title('月度客户流失率趋势', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('流失率', fontsize=12)
plt.xticks(rotation=45)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()

适配不同数据结构的调整

如果你的start_date是客户注册日期,且存在单独的流失日期字段(比如churn_date),只需修改两处:

  1. 将churn_month替换为df['churn_date'].dt.to_period('M')
  2. 期初活跃客户数改为:活跃客户数 = 注册日期早于当前月份的客户数 - 截至上月末已流失的客户数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:35:19