俗话说一图胜千言但是“图”(Graph)说的远不止于此。以图形式呈现的数据可视化能帮助我们获得见解并基于它们做出更好的数据驱动型决策。
但要真正理解图是什么鉯及为什么使用它们我们需要理解一个称为图论(Graph Theory)的概念。理解它可以使我们成为更好的程序员
如果你曾经尝试理解这个概念,应該会遇到大量的公式和干涩的理论这便是为什么我们要写这篇博文的原因。我们先解释概念然后提供实例,以便你可以跟随并弄明白咜的执行方式这是一篇详细的文章,因为我们认为提供概念的正确解释要比简洁的定义更受欢迎
在本文中,我们将了解图是什么它們的应用以及一些历史背景。我们还将介绍一些图论概念然后使用进行案例研究以巩固理解。
准备好了吗我们开始吧。
图论的历史、為何使用图论
让我们看一个简单的图(Graph)来理解这个概念如下图所示:
假设此图代表某个城市的热门景点位置,以及游客所遵循的路径我们把V视为景点位置,将E视为从一个地方到另一个地方的路径
边(u,v)与边(vu)相同 - 它们是无序对。
具体而言图(Graph)是用于研究對象和实体之间成对关系的数学结构。它是离散数学的一个分支在计算机科学,化学语言学,运筹学社会学等领域有多种应用。
数據科学和分析领域也使用图来模拟各种结构和问题作为一名数据科学家,你应该能以有效的方式解决问题如果数据是以特定方式排列嘚,则图可以提供一种解决问题的机制
图是一对集合。G = (V, E)V是顶点集合,E是边集合 E由V中的元素对组成(无序对)
有向图(DiGraph)也是一对集匼。D = (V, A)V是顶点集合,A是弧集合A由V中的元素对组成(有序对)
在有向图的情况下,(uv)和(v,u)之间存在区别通常在这种情况下,边被称为弧以指示方向的概念。
R和Python中都有使用图论概念分析数据的包在本文中,我们将简要介绍一些概念并使用Networkx Python包分析一个数据集
从仩面的例子可以清楚地看出,图在数据分析中的应用是广泛的我们来看几个用例场景:
图可用于找出社交网络中最有影响力的人。广告商和营销人员可以通过社交网络中最有影响力的人员传达他们的信息从而估算最大的营销价格。
图可用于查找有助于减少欺诈交易的异瑺模式有一些例子可以通过分析银行网络的资金流动来侦测恐怖主义活动。
图有助于确定送货卡车的最佳路线以及识别仓库和交付中心嘚位置
制药公司可以使用图论优化销售人员的路线。这有助于降低成本并缩短销售人员的行程时间
电信公司通常使用图(Voronoi图)来了解基站的数量和位置,以确保最大的覆盖范围
图的历史以及为何使用图
如果想更多地了解关于图的想法是如何形成的,请继续阅读!
该理論的起源可以追溯到柯尼斯堡七桥问题(大约1730年代)它提问是否可以在以下限制条件下遍历柯尼斯堡市的七座桥梁
每座桥只经过一次(即不重复)
小故事:欧拉于1736年研究并解决了此问题,他把问题归结为如“一笔画”问题他的《柯尼斯堡七桥》的论文圆满解决了这一问題,同时开创了数学一个新分支---图论
这等价于询问4个节点和7个边的多图(multigraph)是否具有欧拉环(欧拉环是在同一个顶点上开始和结束的欧拉路径。而欧拉路径是指在图中仅仅遍历每个边一次的路径更多术语后文中给出)。这个问题引出了欧拉图的概念柯尼斯堡七桥问题嘚答案是否定的,它最早由欧拉解答
译者注:在图论中,多图(相对于简单图)是指图中允许出现多边(也叫平行边)即两个顶点可鉯有多条边连接,如下图中的红色就是多边所以该图属于多图。
1840年A.F Mobius提出了完全图(complete graph)和二分图(bipartite graph)的概念,Kuratowski通过趣味谜题证明它们是岼面的树的概念(没有环的连通图)由Gustav Kirchhoff于1845年提出,他在计算电网或电路中的电流时使用了图论思想
Haken在一个世纪后才解决了这个问题。這一次被认为是图论真正的诞生
Caley研究了微分学的特定分析形式来研究树。这在理论化学中有许多含义这也导致了枚举图论(enumerative graph theory)的发明。不管怎么说“图”这个术语是由Sylvester在1878年引入的,他在“量子不变量”与代数和分子图的协变量之间进行了类比
1941年,Ramsey致力于着色问题這产生了另一个图论的分支 - 极值图论(Extremal graph theory)。1969年Heinrich使用计算机解决了四色问题。对渐近图连通性的研究产生了随机图论图论和拓扑学的历史也密切相关,它们有许多共同的概念和定理
以下几点可以激励你在日常数据科学问题中使用图:
图提供了一种处理关系和交互等抽象概念的更好的方法。它还提供了直观的视觉方式来思考这些概念图很自然地成了分析社会关系的基础。
图数据库已成为一种常用的计算笁具并且是SQL和NoSQL数据库的替代方案。
图用于以DAG(定向非循环图)的形式建模分析工作流
一些神经网络框架还使用DAG来模拟不同层中的各种操作。
图理论用于研究和模拟社交网络欺诈模式,功耗模式社交媒体的病毒性和影响力。社交网络分析(SNA)可能是图理论在数据科学Φ最著名的应用
它用于聚类算法 - 特别是K-Means。
系统动力学也使用一些图理论 - 特别是循环
路径优化是优化问题的一个子集,它也使用图的概念
从计算机科学的角度来看,图提供了计算效率某些算法的Big O复杂度对于以图形式排列的数据更好(与表格数据相比)。
在进一步阅读夲文之前建议你熟悉这些术语。
顶点u和v称为边(uv)的末端顶点。
如果两条边具有相同的末端顶点则它们是平行的。
形式为(vv)的邊是循环。
如果图没有平行边和循环则图被称为简单图。
如果图没有边则称其为Empty,即E是空的
如果图没有顶点,则称其为Null即V和E是空嘚。
具有共同顶点的边是相邻的具有共同边的顶点是相邻的。
顶点v的度写作d(v),是指以v作为末端顶点的边数按照惯例,我们把一個循环计作两次并且平行边缘分别贡献一个度。
孤立顶点是度数为1的顶点d(1)顶点是孤立的。
如果图的边集合包含了所有顶点之间的所有可能边则图是完备的。
图G =(VE)中的步行(Walk)是指由图中顶点和边组成的一个形如ViEiViEi的有限交替序列。
如果初始顶点和最终顶点不同则Walk是开放的(Open)。如果初始顶点和最终顶点相同则Walk是关闭的(Closed)。
如果任何边缘最多遍历一次则步行是一条Trail。
如果任何顶点最多遍曆一次则Trail是一条路径Path(除了一个封闭的步行)。
在本节中我们将介绍一些对数据分析有用的概念(无特定顺序)。请注意另外还有佷多概念的深度超出了本文的范围。我们开始吧
所有可能节点对应的最短路径长度的平均值。给出了图的“紧密度”度量可用于了解此网络中某些内容的流动速度。
广度优先搜索和深度优先搜索是用于在图中搜索节点的两种不同算法它们通常用于确定我们是否可以从給定节点到达某个节点。这也称为图遍历
BFS的目的是尽可能接近根节点遍历图,而DFS算法旨在尽可能远离根节点
用于分析网络的最广泛使鼡和最重要的概念工具之一。中心性旨在寻找网络中最重要的节点可能存在对“重要”的不同理解,因此存在许多中心性度量标准中惢性标准本身就可以分成好多类。有一些标准是以沿着边的流动为特征还有一些标准以步行结构(Walk Structure)为特征。
度中心性(Degree Centrality) - 第一个也是概念上最简单的中心性定义表示连接到某节点的边数。在有向图中我们可以有2个度中心性度量。流入和流出的中心性
紧密中心性(Closeness Centrality) - 从某节点到所有其他节点的最短路径的平均长度。
这些中心性度量有不同变种并且可以使用各种算法来实现定义。总而言之这方面囿大量的定义和算法。
图的边数的度量实际定义将根据图的类型和所提问问题的上下文而不同。对于完备的无向图密度为1,而空图(empty)为0在某些情况下(包含循环时),图密度可能大于1
尽管一些图度量指标可能很容易计算,但要理解它们的相对重要性并不容易在這种情况下,我们使用网络/图随机化我们计算了手头的图和随机生成的另一些类似图的度量。例如这些相似图可以有相同数量的密度囷节点。通常我们生成1000个相似的随机图并计算每个图的度量标准然后与手头图的相同度量进行比较,以得出某些基准(benchmark)
在数据科学Φ,当尝试对某个图进行声明时如果与某些随机生成的图进行对比,则会有所帮助
让我们看一下使用Networkx软件包可以完成的一些常见事情。包括导入和创建图以及可视化图的方法
通过传递包含节点和属性dict的元组,可以在创建节点和边的时候添加节点和边的属性
除了逐个節点或逐个边地构建图形之外,还可以通过一些经典的图操作来生成它们例如:
对于不同类型的图,存在单独的类例如,nx.DiGraph类允许创建囿向图可以使用单个方法直接创建包含路径的特定图。有关图创建方法的完整列表请参阅完整文档。链接在本文末尾给出
可以使用G.nodes囷G.edges方法访问节点和边。可以使用括号/下标法访问各个节点和边
Networkx提供了可视化图的基本功能,但其主要目标是帮助图分析而不是图的可视囮图可视化很难,我们将使用专门用于此任务的工具Matplotlib提供了一些便利功能。但是GraphViz可能是最好的工具因为它提供了一个PyGraphViz的Python接口(链接茬文档的末尾)。
PyGraphviz可以很好地控制边和节点的各个属性我们可以使用它获得非常漂亮的可视化。
通常可视化被认为是与图分析独立的任务。分析后的图将导出为Dotfile然后单独显示该Dotfile以展示我们想表达的内容。
我们将寻找一个通用数据集(不是专门用于图的数据集)并进行┅些操作(在pandas中)以便它可以以边列表(edge list)的形式输入到图中。边列表是一个元组列表其中的元组包含定义每条边的顶点
我们将关注嘚数据集来自航空业。它有一些关于航线的基本信息有某段旅程的起始点和目的地。还有一些列表示每段旅程的到达和起飞时间如你所想,这个数据集非常适合作为图进行分析想象一下通过航线(边)连接的几个城市(节点)。如果你是航空公司你可以问如下几个問题:
从A到B的最短途径是什么?分别从距离和时间角度考虑
哪些机场的交通最繁忙?
哪个机场位于大多数其他机场“之间”这样它就鈳以变成当地的一个中转站。
我们注意到起始点和目的地看起来像节点的好人选然后可以将所有东西想象为节点或边的属性。单条边可鉯被认为是一段旅程这样的旅程将有不同的时间,航班号飞机尾号等相关信息。
我们注意到年月,日和时间信息分散在许多列上所以我们想创建一个包含所有这些信息的日期时间列。我们还需要将预计的(scheduled)和实际的(actual)到达离开时间分开所以我们最终应该有4个日期時间列(预计到达时间、预计起飞时间、实际到达时间和实际起飞时间)。
此外时间列的格式不正确。下午4:30被表示为1630而不是16:30该列没有汾隔符。一种方法是使用pandas字符串方法和正则表达式
另一个麻烦是NaN值。
现在时间列被转换成了我们想要的格式最后,我们可能希望将年月和日列合并到日期列中。这一步不是绝对必要的但是,一旦转换为日期时间(datetime)格式我们就可以轻松获取年,月日(和其他)信息。
现在使用networkx函数导入数据集该函数直接读如pandas DataFrame。就像图创建一样多种方法可以将数据从多种格式中输入到图中。
从可视化中(上面嘚方式)可以明显看出 - 从一些机场到其他机场有多条路径 假如想要计算2个机场之间的最短路线。我们可以想到几种方法:
我们可以通过距离或飞行时间来给路径赋予权重并用算法计算最短路径。请注意这是一个近似的解决方案 - 实际问题是计算当你到达中转机场时的航癍可用性加候机的等待时间,这才是一种更完整的方法也是人们计划旅行的方式。出于本文的目的我们将假设你到达机场时可以随时使用航班并使用飞行时间作为权重,从而计算最短路径
让我们以JAX和DFW机场为例:
本文充其量只是对图论和网络分析这一非常有趣的领域进荇了粗浅的介绍。对理论和Python软件包的了解将为任何数据科学家的工具库增加一个有价值的工具 对于上面使用的数据集,可以提出一系列其他问题例如:
在给定成本,飞行时间和可用性的情况下找到两个机场之间的最短路径?
作为一家航空公司你们拥有一队飞机。你叻解航班的需求假设你有权再运营2架飞机(或者为你的机队添加2架飞机),把这两架飞机投入到哪条航线可以最大限度地提高盈利能力
你可以重新安排航班和时刻表以优化某个参数吗?(如时效性或盈利能力等)
本文来自云栖社区合作伙伴“”了解相关信息可以关注“”