首先来回答一个问题,什么是桑基图?
不废话,先上东西:
上面这个图片就是【桑基图】,桑基图的一个典型特征就是能量的分流,数据按照一定的规则呈现结构化的分布,它主要包括三个部分:节点、节点之间的链接、节点链接的数据。
桑基图对于数据分析师来说应用非常广泛,因为数据分析师的工作就是把繁杂的数据一层层拆解,最终找到引发问题出现的原因,例如流量拆解、GMV拆分、消费者预估等等。
怎样快速做出一个多层级的桑基图?
pyecharts 是用 Python 写的可视化工具包,调用简单,操作方便。
第一步:安装 pyecharts
pip install pyecharts
第二步:导入工具包
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Sankey
第三步:导入数据
nodes = [
{"name": "总客户"},
{"name": "新客"},
{"name": "老客"},
{"name": "一次老客"},
{"name": "二次老客"},
{"name": "三次老客"},
]
links = [
{"source": "总客户", "target": "新客", "value": 500},
{"source": "新客", "target": "一次新客", "value": 500},
{"source": "总客户", "target": "老客", "value": 300},
{"source": "老客", "target": "二次老客", "value": 100},
{"source": "老客", "target": "三次老客", "value": 100},
]
第四步:生成图表
sankey = Sankey()
sankey.add(
"sankey",
nodes,
links,
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
sankey.set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"))
sankey.render_notebook()
除了安装包之外,三步就可以生成一个桑基图。下面我来解释一下,Sankey 这个类当中的参数:
"sankey" 图表的名称
nodes 节点数据,格式为json
links 节点之间的连接,格式为json
linestyle_opt / opacity 不透明度
linestyle_opt / curve 弯曲程度
linestyle_opt / color 配色
主要的一点要注意,nodes 和 links 一定要满足规定的条件格式,一般数据源都是在excel 或者在数据库中保存,接下来我们要做的是:怎样把本地数据源,变成可用的数据格式
先看下我们的数据源:
这个数据源就是文章开头那个桑基图的数据,它包含了两个层级,所以,第一步我们要做的是,构建nodes(节点)数据:
df_columns = list(df.columns)[:-1]
node_list = []
for column in df_columns:
df_node = df[column].unique()
for node in df_node:
dic = {}
dic['name'] = node
node_list.append(dic)
print(node_list)
-----------------------------------------
[{'name': '消费者'}, {'name': '新客'}, {'name': '老客'}, {'name': '连衣裙'},
{'name': '裤子'}, {'name': '衬衫'}, {'name': 'T恤'},
{'name': '针织衫'}, {'name': '外套'}, {'name': '运动鞋'}, {'name': '休闲鞋'},
{'name': '低帮鞋'}, {'name': '拖鞋'}, {'name': '跑鞋'}]
第二步构建links:
把【客户属性】和【一级类目】组合,完成第一层级的数据,以便达到下面的效果:
客户属性一级类目购买人数
0消费者新客2021
1消费者老客2628
再把第二层级拿出来,与第一层的数据组合起来,完整代码如下:
df_lv1 = df.groupby(['客户属性', '一级类目']).sum()
df_lv1 = df_lv1.reset_index()
df_lv2 = df.iloc[:,1:]
df_lv1.columns = ['from', 'to', 'data']
df_lv2.columns = ['from', 'to', 'data']
df_links = pd.concat([df_lv1, df_lv2])
links_list = []
for link in df_links.values:
link_dict = {}
link_dict["source"] = link[0]
link_dict["target"] = link[1]
link_dict["souvaluerce"] = link[2]
links_list.append(link_dict)
最后,把组合好的数据放入模板当中:
new_sankey = Sankey()
new_sankey.add(
"",
node_list,
links_list,
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
new_sankey.set_global_opts(title_opts=opts.TitleOpts(title="新老客购买类目"))
new_sankey.render_notebook()
就形成了文章开头的图片样式。
数据可视化涉及到的图表类型还有很多,之后会陆续为大家更新。
领取专属 10元无门槛券
私享最新 技术干货