桑基图实战:从 50 万条评论里看”用户从哪儿来到哪儿去”

老板们最常问的问题:

这些”从哪儿到哪儿”的问题,桑基图是最好的答案。

一、桑基图是什么?

桑基图(Sankey Diagram)是一种通量图,专门展示多对多关系:

3 个核心特征:

  1. 流向清晰:箭头 = 流向
  2. 多对多:1 个源可连多个目标
  3. 权重可视化:线宽一眼看出谁多谁少

二、最常见 3 大应用场景

场景 1:用户路径分析

1
2
3
4
搜索词  ──→  商品页  ──→  下单/跳出
百度 小米手机 50%/30%
小红书 华为手机 30%/40%
抖音 苹果手机 20%/30%

老板一眼看出:小红书进店用户转化率最高(40% > 30%) → 加投小红书。

场景 2:LDA 主题演化

1
2
2021 Q1 T1(数字经济) ──→ 2021 Q2 T2(数字化转型) ──→ 2021 Q3 T3(数字政府)
──→ 2021 Q3 T4(工业互联网)

主题之间的”流向”= 相似度高 + 词集重叠。

场景 3:资金流向 / 能源流向

1
2
3
4
5
营业收入 ──→ 主营业务成本 (60%) ──→ 净利润
──→ 销售费用 (15%) ──→ 留存收益
──→ 研发费用 (10%) ──→ 现金
──→ 管理费用 (8%)
──→ 财务费用 (7%)

三、Python 5 行核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from pyecharts import options as opts
from pyecharts.charts import Sankey

nodes = [
{'name': '百度'}, {'name': '小红书'}, {'name': '抖音'},
{'name': '小米手机'}, {'name': '华为手机'}, {'name': '苹果手机'},
{'name': '下单'}, {'name': '跳出'},
]

links = [
{'source': '百度', 'target': '小米手机', 'value': 300},
{'source': '百度', 'target': '华为手机', 'value': 200},
{'source': '小红书', 'target': '华为手机', 'value': 400},
{'source': '小红书', 'target': '苹果手机', 'value': 350},
{'source': '抖音', 'target': '苹果手机', 'value': 500},
{'source': '小米手机', 'target': '下单', 'value': 150},
{'source': '小米手机', 'target': '跳出', 'value': 150},
{'source': '华为手机', 'target': '下单', 'value': 300},
{'source': '华为手机', 'target': '跳出', 'value': 100},
{'source': '苹果手机', 'target': '下单', 'value': 350},
{'source': '苹果手机', 'target': '跳出', 'value': 150},
]

Sankey(init_opts=opts.InitOpts(width='1200px', height='600px'))
.add(
'用户路径',
nodes,
links,
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color='source'),
label_opts=opts.LabelOpts(position='right'),
node_gap=20,
)
.set_global_opts(title_opts=opts.TitleOpts(title='用户路径桑基图'))
.render('sankey.html')

就这么简单。输出的 HTML 鼠标悬停能看到具体流量,4K PNG 一键导出。

四、LDA 主题演化桑基图(进阶)

LDA 主题演化分析 的核心就是桑基图。我们来跑一遍:

1. 数据准备

5 万条政策文件,按季度分窗,跑 LDA:

1
2
3
4
5
6
7
8
9
10
11
12
import gensim
from gensim.models import LdaModel

# 4 个时间窗
periods = ['2021Q1', '2021Q2', '2021Q3', '2021Q4']
lda_models = {}
for p in periods:
corpus = load_corpus(p) # 加载该季度语料
lda_models[p] = LdaModel(
corpus=corpus, id2word=dictionary,
num_topics=5, passes=15, random_state=42
)

2. 主题相似度计算

Jaccard 相似度(前 10 词的交集 / 并集)算两个主题之间的相似度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def topic_words(model, topic_id, topn=10):
return set(w for w, _ in model.show_topic(topic_id, topn=topn))

def jaccard(set_a, set_b):
return len(set_a & set_b) / len(set_a | set_b)

# 算相邻两个季度的主题相似度
similarity = {} # (period_a, topic_a, period_b, topic_b) -> jaccard
for i in range(len(periods) - 1):
p_a, p_b = periods[i], periods[i+1]
for ta in range(5):
words_a = topic_words(lda_models[p_a], ta)
for tb in range(5):
words_b = topic_words(lda_models[p_b], tb)
sim = jaccard(words_a, words_b)
if sim > 0.2: # 阈值:相似度 > 0.2 才画线
similarity[(p_a, ta, p_b, tb)] = sim

3. 生成桑基图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 节点:每个主题标"季度-主题编号"
nodes = []
node_ids = {}
for p in periods:
for t in range(5):
node_name = f'{p}-T{t}'
node_ids[(p, t)] = node_name
nodes.append({'name': node_name})

# 连线:相似度 = 流量
links = []
for (p_a, ta, p_b, tb), sim in similarity.items():
# 通量 = 相似度 * 该主题文档数
flow = sim * doc_count[(p_a, ta)]
links.append({
'source': node_ids[(p_a, ta)],
'target': node_ids[(p_b, tb)],
'value': round(flow, 1)
})

结果:桑基图直接看出主题的”流向”——T1(数字经济)主要流到 T2(数字化转型),T3(工业互联网)从 T2 派生。

五、踩坑大全

1. 节点太多线太密

2. 通量值都是 0

3. 中文字体乱码

4. 节点颜色统一不好看

5. HTML 太大加载慢

六、软件功能

我们的 桑基图制作软件 ¥19.80 把上面所有代码封装成 GUI:

功能 详情
数据导入 Excel / CSV / TXT,3 列(源-目标-流量)即可
节点配色 6 套主题色 + 自定义 HEX
连线 直线 / 曲线切换,透明度调节
字体 中文字体一键选(免去手写 font_path)
导出 HTML(可交互)+ PNG(4K)+ SVG(矢量)
联动 LDA 主题演化分析软件直接出桑基图 + 相似度矩阵

配套软件:LDA 主题演化分析 ¥69——把 LDA + 桑基图 + 相似度矩阵三件套打包,直接出政策/资讯/评论的时间演化报告。

七、典型用户场景

① 政策研究:5 年政策文件主题演化 → 看政策导向怎么”流”
② 电商运营:用户从搜索→商品→下单路径 → 优化投流
③ 财务分析:公司收入→成本→利润分配 → 给老板看
④ 能源/物流:煤炭→发电→工业用电,流量一览
⑤ 学术论文:科研合作网络(作者→机构→国家)

八、立即试用

软件 售价 适用场景
桑基图制作软件 ¥19.80 通用通量/路径可视化
LDA 主题演化分析 ¥69.00 时间序列 + 主题流变
一站式文本分析套餐 ¥68.00 入门组合

本文由 小朵科技工作室 原创,专注 Python 数据可视化 6 年。