0Pricing
Pandas & NumPy Academy · 课时

漏斗分析

跟踪到达多步骤漏斗各个步骤的用户数量,并计算相邻步骤之间的转化率。

漏斗分析 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

什么是转化漏斗

转化漏斗用于建模用户依次完成一系列必要步骤的过程,例如:首页 → 产品页 → 加入购物车 → 结算 → 购买。在每一步,都会有部分用户流失,无法到达下一步。漏斗分析会量化这些流失,帮助团队优先确定首先需要改进的步骤。输出结果是一张表,展示每个步骤的用户数和转化率。

import pandas as pd

FUNNEL_STEPS = [
    'homepage',
    'product_page',
    'add_to_cart',
    'checkout',
    'purchase'
]

df = pd.read_csv('clickstream.csv', parse_dates=['timestamp'])
print(df['event_type'].value_counts())

统计每一步的独立用户数

对于每个漏斗步骤,统计至少触发过一次该事件的独立用户数量。在循环中使用 df[df['event_type'] == step]['user_id'].nunique(),并将结果收集到字典中。转换为 Series 后,只需进行一次除法即可轻松完成后续的百分比计算。

step_counts = {}
for step in FUNNEL_STEPS:
    users = df[df['event_type'] == step]['user_id'].nunique()
    step_counts[step] = users

funnel = pd.Series(step_counts, name='users')
print(funnel)

计算步骤之间的转化率

步骤间转化率表示完成第 N 步的用户中,有多大比例完成了第 N+1 步。使用 funnel.shift(1) 获取上一步的用户数,然后进行除法计算:funnel / funnel.shift(1) * 100。第一步没有上一步,因此其转化率可能是 NaN,也可能根据基准定义为 100%。

funnel_df = funnel.to_frame()
funnel_df['prev_users'] = funnel_df['users'].shift(1)
funnel_df['step_conversion_%'] = (funnel_df['users'] / funnel_df['prev_users'] * 100).round(1)
print(funnel_df)

计算整体转化率

整体转化率表示所有从第 1 步进入漏斗的用户中,最终完成最后一步的用户比例。用最后一步的用户数除以第一步的用户数即可。在电子商务中,从首页到购买的整体转化率通常为 2%–5%;低于这一范围通常说明漏斗中的某处存在严重流失。

overall_rate = funnel.iloc[-1] / funnel.iloc[0] * 100
print(f'Overall conversion rate: {overall_rate:.1f}%')

funnel_df['overall_conversion_%'] = (funnel_df['users'] / funnel_df['users'].iloc[0] * 100).round(1)
print(funnel_df[['users', 'overall_conversion_%']])

有序漏斗:要求步骤顺序

简单的独立用户计数会把那些直接进入结算、却没有访问产品页的用户视为有效漏斗用户,从而抬高早期步骤的转化率。若要强制要求步骤顺序,请检查每个用户是否在到达第 N 步之前已经到达第 N-1 步。这需要比较时间戳:用户必须先触发 product_page 事件,之后才能触发 add_to_cart 事件。

# Get first occurrence of each step per user
first_events = df.groupby(['user_id', 'event_type'])['timestamp'].min().unstack('event_type')

# Enforce ordering: each step must come after the previous
first_events['valid_to_cart'] = first_events['add_to_cart'] > first_events['product_page']
print(first_events[['product_page', 'add_to_cart', 'valid_to_cart']].head())

按细分群体分析漏斗:设备类型

不同用户群体的转化率可能存在很大差异。使用 groupby('device_type'),分别为桌面设备用户和移动设备用户执行相同的漏斗计算。如果移动用户在结算步骤大量流失,说明结算页面可能在小屏幕上存在可用性问题。按群体划分的漏斗可以揭示有针对性的优化机会。

def funnel_for_group(group_df):
    counts = {}
    for step in FUNNEL_STEPS:
        counts[step] = group_df[group_df['event_type'] == step]['user_id'].nunique()
    return pd.Series(counts)

segmented_funnel = df.groupby('device_type').apply(funnel_for_group)
print(segmented_funnel)

识别流失最大的步骤

用户绝对损失量最大的步骤,是优化优先级最高的目标。使用 funnel.diff() 计算相邻步骤用户数之差即可找到该步骤——最负的值对应最大的流失。请同时以数字和可视化形式向利益相关者呈现这一发现。

dropoffs = funnel.diff().abs()
biggest_drop = dropoffs.idxmax()
biggest_drop_count = dropoffs.max()

print(f'Biggest drop-off: {biggest_drop} ({biggest_drop_count:.0f} users lost)')

漏斗步骤之间的时间

用户从一个步骤进入下一个步骤所需的时间可以揭示流程阻力。如果用户从加入购物车到结算需要等待数小时,发送购物车放弃提醒邮件可能会挽回这些用户。使用 first_events DataFrame,先将相邻时间戳列相减,再对所有用户取中位数,以计算每一对步骤之间的中位时间。

for i in range(1, len(FUNNEL_STEPS)):
    prev = FUNNEL_STEPS[i-1]
    curr = FUNNEL_STEPS[i]
    delta = (first_events[curr] - first_events[prev]).dt.total_seconds() / 60
    print(f'{prev} -> {curr}: median {delta.median():.1f} min, 90th pct {delta.quantile(0.9):.1f} min')

每周漏斗趋势

分别计算每周的漏斗,以跟踪转化率是否逐周改善或恶化。使用 first_events['homepage'].dt.isocalendar().week 按周对首次事件表进行分组,并计算每周的整体转化率。某一周突然下降,可能与产品发布或营销调整同时发生。

df['week'] = df['timestamp'].dt.isocalendar().week

weekly_conv = []
for week, wdf in df.groupby('week'):
    top = wdf[wdf['event_type'] == FUNNEL_STEPS[0]]['user_id'].nunique()
    bot = wdf[wdf['event_type'] == FUNNEL_STEPS[-1]]['user_id'].nunique()
    weekly_conv.append({'week': week, 'conversion_%': bot/top*100 if top else 0})

print(pd.DataFrame(weekly_conv))

构建漏斗汇总 DataFrame

将所有漏斗指标整理到一个清晰的汇总 DataFrame 中,以便导出到报告或用于可视化。请包含步骤名称、用户数、步骤间转化率、整体转化率和流失用户数等列。该 DataFrame 应作为漏斗分析的交付成果,并且工程师和产品经理都能读懂。

summary = pd.DataFrame({
    'step': FUNNEL_STEPS,
    'users': [step_counts[s] for s in FUNNEL_STEPS]
})
summary['users_lost'] = summary['users'].shift(-1).rsub(summary['users'])
summary['step_conv_%'] = (summary['users'] / summary['users'].shift(1) * 100).round(1)
summary['overall_conv_%'] = (summary['users'] / summary['users'].iloc[0] * 100).round(1)
print(summary)

将漏斗可视化为柱状图

将漏斗绘制为水平条形图,其中每个条形的长度表示该步骤的用户数量。按照从上到下(用户最多到最少)的顺序排列条形后,漏斗形状会自然呈现出来。为每个条形标注步骤间转化率,使读者无需参照单独的数据表即可理解图表。

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.barh(summary['step'][::-1], summary['users'][::-1], color='steelblue')
for i, row in summary[::-1].iterrows():
    ax.text(row['users'], i - summary.index[0], f'  {row['step_conv_%']}%', va='center')
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()

快速检查

测试您对本课数据分析概念的理解。

课程回顾

在本课中,您学习了:统计漏斗各步骤的唯一用户数、计算步骤间转化率和总体转化率,以及按设备类型划分漏斗并跟踪每周转化趋势。接下来,我们将学习群组留存表,以跟踪用户每周的回访情况。

常见问题解答

「漏斗分析」课时是免费的吗?

是的 — 「漏斗分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「漏斗分析」这节课中我会学到什么?

跟踪到达多步骤漏斗各个步骤的用户数量,并计算相邻步骤之间的转化率。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「漏斗分析」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 会话划分与事件排序
  2. 漏斗分析
  3. 同期群留存表
  4. 可视化用户旅程
← 返回 Pandas & NumPy Academy