漏斗分析核心是确保用户行为时序正确、去重严谨、计算逻辑精准。需按user_id和timestamp双重排序,每用户每环节仅取首次行为,转化率基于用户集合交集计算,导出静态图须用kaleido并设scale=2。

漏斗步骤顺序错乱导致转化率全错
漏斗分析最基础也最容易翻车的点:数据没按用户行为时序排好。比如把 click 放在 pay 后面统计,转化率就变成“先付款再点击”,结果完全失真。
实操建议:
• 用 pandas.DataFrame.sort_values() 按 user_id 和 timestamp 双重排序,别只按时间——同一用户可能跨天操作;
• 每个用户只保留每个环节的首次行为(drop_duplicates(subset=['user_id', 'step'], keep='first')),否则重复点击会虚高分母;
• 检查是否有用户跳步(如直接从 view 到 pay),这类要归入“异常路径”,别硬塞进标准漏斗。
Plotly漏斗图不显示百分比或数值
默认 plotly.express.funnel() 只画柱子,不标数字,容易误判哪一环掉得最狠。
实操建议:
• 必须显式传入 labels={'value': 'count'}(哪怕你列名就是 count);
• 数值标签靠 textposition='inside' + textinfo='value+percent initial' 控制,注意 percent initial 是相对于首步的累计占比,不是相邻两步的转化率;
• 如果用 plotly.graph_objects.Funnel() 手动构建,记得给 text 参数传一个和 y 等长的列表,否则报错 ValueError: Invalid value of type 'builtins.list' received for the 'text' property。
立即学习“Python免费学习笔记(深入)”;
各环节转化率计算逻辑写错
常见错误是直接用后一步人数除以前一步人数,但漏了「同一用户只能算一次」这个前提。比如 100 人进入首页,其中 30 人完成支付,但中间有 20 人反复加购,单纯用加购数 / 首页数会得到虚假高转化。
实操建议:
• 先按 user_id 分组,对每组取各环节是否发生的布尔值(df.groupby('user_id')['step'].apply(lambda x: set(x) >= {'view', 'cart', 'pay'}));
• 转化率 = len(users_in_step_B & users_in_step_A) / len(users_in_step_A),用集合交集比用 merge 更稳;
• 别用 df['step'] == 'cart' 直接计数——这统计的是行为次数,不是去重用户数。
交互式漏斗图导出为静态图模糊或丢失标签
用 fig.write_image() 导出 PNG 时,常出现文字锯齿、漏掉 hover 提示里的字段,甚至整个图变空白。
实操建议:
• 必须提前装好 orca 或 kaleido(推荐后者:pip install kaleido);
• 导出前设 fig.update_layout(font_size=14),小字号在静态图里极易糊;
• 如果用 kaleido,调用 fig.write_image("funnel.png", width=800, height=500, scale=2),scale=2 是关键,否则默认分辨率太低;
• hover 信息不会进静态图,想保留就得另存 HTML:fig.write_html("funnel.html")。


















