上一章介绍了简单的两节点的Sankey图的制作(https://www.jianshu.com/p/d1ad468d79c8),本章介绍稍微复杂些的Sankey图的制作。
一、多节点Sankey图的制作
多节点的Sankey图的脚本和两节点的是一致的,差别主要在于要进行数据预处理。
比如上一章中二节点Sankey图的原始数据结构为:
(表1)假如再增加一个维度,数据结构变成:
(表2)这种数据在制作Sankey图之前,需要整合成表1中的结构,即把多3变量整合成2变量的结构,如该例子中、是把state+continent、land+state分别作为key进行汇总、然后做竖向合并,整合后的数据如下:
(表3)当数据整合成表3的结构后,R和Python均能调用之前的脚本进行绘制了,绘制结果如下:
1.1 使用Python制作Sankey图
(图1)这里需要留意的是,用Python绘制时,links的两个节点不能相同、否则会导致出错及绘图失败 。
1.2 使用R制作Sankey图
R的局限性:如果分类过多会导致显示异常,故这里仅挑选了美洲、亚欧做示例:
(图2)二、用户行为(点击流)可视化
Sankey图的一大作用是对用户行为进行可视化,实际工作中常用于分析用户流失留存。
和多节点的Sanky图类似,这类图的绘制重点也是在数据的预处理,并且这类数据和之前介绍的有一个最明显的差别是,分类统计中各类别间是不分先后的,而用户行为是必须强调先后次序的,这个先后需要体现在原始数据中。
下面案例的数据是一个网站的新用户访问行为,日志记录了用户访问每个页面的时间、页面id,我们需要了解新用户的访问次序、以及用户在哪个步骤流失最多、并对其进行可视化展示。
数据预处理上,先对每个用户访问的页面次序进行处理:
用户1、当前页面id、该页面的访问排序、下一个页面id、下一页面的访问排序
用户2、当前页面id、该页面的访问排序、下一个页面id、下一页面的访问排序
……
然后统计汇总成:
当前页面id+访问排序、下一页面id+访问排序、访问用户数
将数据处理成这个形式后,就可以按照之前的方式制作点击流的可视化效果图了:
2.1 使用Python制作Sankey图
(图3)将鼠标移到对应的links上,可以看到links的信息,如这个节点的含义为,第一个页面访问“注册成功-进入后台”、第二个页面跳转到“登录后首页”的用户数有8712个。
(图4)2.2 使用R制作Sankey图
(图5)制图代码:
library(networkD3)
#读入数据 (read.csv函数)
a1 = read.csv("E:\\hill2020\\Python相关\\sankey_click.csv",sep=',',header=TRUE)
#由于原始数据比较细,全部作图线多且乱、看不出规律,这里只取了频次200以上的作图,实操中可以根据数据情况做调整
a <- subset(a1,v>=200)
# 导入数据的起点终点是factor类型,需要将其转为chr,否则之后unique的是因子水平,不能进行合并。
a$s=as.character(a$s)
a$t=as.character(a$t)
#开始绘图
#设置节点
Sankeylinks<-a
Sankeynodes<-data.frame(name=unique(c(Sankeylinks$s,Sankeylinks$t)))
Sankeynodes$index<-0:(nrow(Sankeynodes)-1)
#设置边
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="s",by.y="name")
Sankeylinks<-merge(Sankeylinks,Sankeynodes,by.x="t",by.y="name")
Sankeydata<-Sankeylinks[,c(4,5,3)]
names(Sankeydata)<-c("Source","Target","Value")
Sankeyname<-Sankeynodes[,1,drop=FALSE]
#输出结果图,最终是一个html文件
sankeyNetwork(Links=Sankeydata,Nodes=Sankeyname,Source="Source",Target="Target",Value="Value",NodeID="name",fontSize=12,nodeWidth=30)
网友评论