使用 Power BI 和 R 进行社交网络分析:自定义视觉效果指南

已发表: 2022-07-22

社交网络分析正迅速成为满足各种专业需求的重要工具。 它可以告知企业目标,例如有针对性的营销,并识别安全或声誉风险。 社交网络分析还可以帮助企业实现内部目标:它提供对员工行为和公司不同部门之间关系的洞察。

组织可以采用多种软件解决方案进行社交网络分析; 每个都有其优点和缺点,并且适用于不同的目的。 本文重点介绍 Microsoft 的 Power BI,它是当今最常用的数据可视化工具之一。 虽然 Power BI 提供了许多社交网络加载项,但我们将探索 R 中的自定义视觉对象,以创建更引人注目和更灵活的结果。

本教程假设您了解基本的图论,尤其是有向图。 此外,后面的步骤最适合 Power BI Desktop,它仅在 Windows 上可用。 读者可以在 Mac OS 或 Linux 上使用 Power BI 浏览器,但 Power BI 浏览器不支持某些功能,例如导入 Excel 工作簿。

为可视化构建数据

创建社交网络从收集连接(边缘)数据开始。 Connections 数据包含两个主要字段:源节点目标节点——边缘两端的节点。 除了这些节点,我们还可以收集数据以产生更全面的视觉洞察力,通常表示为节点或边缘属性:

1) 节点属性

  • 形状颜色:表示用户的类型,例如,用户的位置/国家
  • Size :表示在网络中的重要性,例如,用户的关注者数量
  • Image :作为个人标识符操作,例如,用户的头像

2) 边缘属性

  • 颜色笔划箭头连接:表示连接的类型,例如,连接两个用户的帖子或推文的情绪
  • 宽度:表示连接强度,例如,在给定时间段内两个用户之间观察到多少次提及或转发

让我们检查一个示例社交网络视觉对象,以了解这些属性如何发挥作用:

由不同宽度的线连接的圆图显示为三个不同的部分。图的左侧有六个不同大小的绿色形状,以六边形标记为 1、2、3、4、5 和 6。数字 1-5 是圆形,而 6 是菱形。它们由不同宽度和方向的绿色箭头相互连接,一些箭头填充为绿色,而另一些则不填充。绿色形状的右侧是下一部分:三个深蓝色形状排列成一个三角形,分别标记为 7、8 和 9,并由不同宽度和方向的蓝色箭头相互连接(一些箭头填充为蓝色)。节点 7 和 9 使用不同宽度和方向的灰色箭头连接到节点 3 和 4(一些箭头填充灰色)。在图的中间,在前两个形状组的下方,是一个标记为 10 的浅蓝色菱形。它通过不同宽度和方向的灰色虚线箭头连接到节点 5、4 和 9(一些箭头填充灰色) .
绿色、浅蓝色和深蓝色节点以及不同的圆形或菱形显示不同的节点类型。 具有透明背景的数字作为节点图像标识符,较大的节点(如节点 4)在网络中更为重要。 不同的边缘类型用颜色(绿色、蓝色或灰色)、笔划(实线或虚线)和箭头(空或填充)表示; 边缘宽度显示强度(例如,从节点 8 到节点 9 的连接很牢固)。

我们还可以使用悬停文本来补充或替换上述参数,因为它可以支持其他无法通过节点或边属性轻松表达的信息。

比较 Power BI 的社交网络扩展

在定义了社交网络的不同数据特征之后,让我们来看看用于在 Power BI 中可视化网络的四种流行工具的优缺点。

扩大Arthur Graus 的社交网络图网络导航器ZoomCharts 的高级网络(轻量版) 使用 R 自定义可视化
动态节点大小是的是的是的是的
动态边缘尺寸是的是的
节点颜色定制是的是的是的
复杂的社交网络处理是的是的是的
节点的配置文件图像是的是的
可调变焦是的是的是的
前 N 个连接过滤是的
悬停的自定义信息是的
边缘颜色定制是的
其他高级功能是的


Arthur Graus 的 Social Network Graph、Network Navigator 和 ZoomCharts 的 Advanced Networks(轻量版)都是适合开发简单社交网络并开始您的第一个社交网络分析的扩展。

许多深蓝色、浅蓝色和橙色圆圈(50+ 圆圈)由白色背景上的细灰色线条连接。圆圈有一个纯色边框,并充满了各种口袋妖怪的小图像,它们有白色背景,圆圈挡住了大部分灰色线条的视线。它们整体形成一个圆形。
使用 Arthur Graus 扩展的社交网络图制作的示例可视化。

许多蓝色、紫色和灰色圆圈(50 多个圆圈)由白色背景上的细灰色线条连接。圆圈是实心的,实心的,挡住了一些灰线的视线。它们整体形成一个圆形排列。
使用 Network Navigator 扩展制作的示例可视化。

许多大青色和小橙色圆圈(50+ 圆圈)由白色背景上的细灰色线条连接。圆圈是实心的并且是实心的,大部分灰线是可见的。它们整体形成水平楔形,右侧出现更密集的圆圈。在图表的左下方,有几个小部件图标和两个标记的圆圈:一个标记为“来自用户”的蓝绿色圆圈和一个标记为“给用户”的橙色圆圈。图表的右下方是一个标有“zoomcharts”的标志。
ZoomCharts (Light Edition) 扩展使用 Advanced Networks 制作的示例可视化。

但是,如果您想通过引人注目的视觉效果让您的数据变得生动并发现突破性的见解,或者如果您的社交网络特别复杂,我建议您在 R 中开发您的自定义视觉效果。

许多绿色、蓝色和紫色圆圈(50 多个圆圈)由白色背景上不同颜色(绿色、灰色和红色)的细线连接。圆圈是实心的,并且在它们的中心填充了一个口袋妖怪图像,并且大部分细线都是可见的。它们整体形成一个展开的圆形,绿色圆圈经常向较小的蓝色或紫色圆圈分支。图表的右上角有文字“社交网络”,图表下方是带有相关文字的线条和圆圈图例:带有文字“Positive”的绿色线条,带有文字“Neutral”的灰色线条一条带有文字“Negative”的红线,一个带有文字“Mention”的蓝色圆圈和一个带有文字“Retweet”的紫色圆圈。
使用 R 中的自定义视觉效果制作的示例可视化。

这个自定义可视化是我们教程在 R 中的社交网络扩展的最终结果,并展示了 R 提供的大量特征和节点/边缘属性。

使用 R 为 Power BI 构建社交网络扩展

使用 R 创建扩展以在 Power BI 中可视化社交网络包括五个不同的步骤。 但在我们构建社交网络扩展之前,我们必须将数据加载到 Power BI 中。

先决条件:为 Power BI 收集和准备数据

您可以使用基于 Twitter 和 Facebook 数据的测试数据集来学习本教程,或者继续使用您自己的社交网络。 我们的数据是随机的; 如果需要,您可以下载真实的 Twitter 数据。 收集所需数据后,将其添加到 Power BI(例如,通过导入 Excel 工作簿或手动添加数据)。 您的结果应类似于下表:

将出现一个具有 13 行交替的灰色和白色行的表格。它有一个标题——“社交网络”——下面有标题。第一列标记为“来自用户”,有八个“1”文本,后跟五个“2”文本。第二列标记为“致用户”,读取(从上到下):2、3、5、6、7、8、9、10、7、8、11、13、14。第三列标记为“ Number of Connections” 并读取(从上到下):12, 46, 29, 79, 49, 11, 90, 100, 66, 29, 62, 13, 45。第四列标记为“Type”并读取(从上到下):转推,提及,提及,转推,转推,转推,提及,提及,转推,转推,转推,转推,提及。第五列标记为“情绪”,并读取(从上到下):正面、正面、负面、中性、正面、负面、正面、中性、中性、负面、负面、负面、负面。第六列标记为“来自用户名”,有八个“Aaliyah”文本,后跟五个“Aaron”文本。第七栏为“To User Name”,从上到下依次为:Aaron, Abel, Abraham, Ace, Adalyn, Adalynn with two Ns, Adam, Addison, Adalyn, Adalynn with two Ns, Adeline, Adriel, Aidan。第八列是“来自 Avatar”,有八个“https://raychemmedica.com/SampleImages/Pokemon/1.png”文本,后跟五个“https://raychemmedica.com/SampleImages/Pokemon/2.png”文本.第九列显示“致阿凡达”,每个条目都有文本“https://raychemmedica.com/SampleImages/Pok”,似乎被切断了。

设置好数据后,您就可以创建自定义可视化了。

第 1 步:设置可视化模板

开发 Power BI 可视化并不简单——即使是基本的视觉效果也需要数千个文件。 幸运的是,Microsoft 提供了一个名为pbiviz的库,它只需几行代码即可提供所需的基础架构支持文件。 pbiviz库还将我们所有的最终文件重新打包成一个.pbiviz文件,我们可以将其作为可视化直接加载到 Power BI 中。

安装pbiviz的最简单方法是使用 Node.js。 安装pbiviz ,我们需要通过机器的命令行界面初始化我们的自定义 R 视觉对象:

 pbiviz new toptalSocialNetworkByBharatGarg -t rhtml cd toptalSocialNetworkByBharatGarg npm install pbiviz package

不要忘记将toptalSocialNetworkByBharatGarg替换为您的可视化所需的名称。 -t rhtml通知pbiviz包它应该创建一个模板来开发基于 R 的 HTML 可视化。 您会看到错误,因为我们尚未在包中指定作者姓名和电子邮件等字段,但我们将在本教程后面解决这些问题。 如果pbiviz脚本根本无法在 PowerShell 中运行,您可能首先需要允许带有Set-ExecutionPolicy RemoteSigned脚本。

成功执行代码后,您将看到一个具有以下结构的文件夹:

一个文件资源管理器列表,包含八个子文件夹(.tmp、.vscode、assets、dist、node_modules、r_files、src 和 style)和八个文件(capabilities.json、dependencies.json、package.json、package-lock.json、pbiviz .json、script.r、tsconfig.json 和 tslint.json)。除capabilities.json (2 KB) 和package-lock.json (23 KB) 外,所有文件均为1 KB。

一旦我们准备好文件夹结构,我们就可以为我们的自定义可视化编写 R 代码。

第 2 步:在 R 中编写可视化代码

第一步创建的目录包含一个名为script.r的文件,其中包含默认代码。 (默认代码创建一个简单的 Power BI 扩展,它使用 R 中可用的iris示例数据库按Petal.Species绘制Petal.Length的直方图。)我们将更新代码但保留其默认结构,包括其注释部分。

我们的项目使用三个 R 库:

  • DiagrammeR:从文本创建图形
  • visNetwork:提供交互式网络可视化
  • data.table:协助数据组织,类似于 data.frame

让我们替换script.rLibrary Declarations部分中的代码以反映我们的库使用情况:

 libraryRequireInstall("DiagrammeR") libraryRequireInstall("visNetwork") libraryRequireInstall("data.table")

接下来,我们将用我们的 R 代码替换Actual code部分中的代码。 在创建可视化之前,我们必须首先读取和处理我们的数据。 我们将从 Power BI 获取两个输入:

  • num_records :数字输入N ,这样我们将只选择网络中前N个连接(以限制显示的连接数)
  • dataset :我们的社交网络节点和边

要计算我们将绘制的N个连接,我们需要聚合num_records值,因为 Power BI 将默认提供一个向量而不是单个数值。 像max这样的聚合函数实现了这个目标:

 limit_connection <- max(num_records)

我们现在将dataset读取为带有自定义列的data.table对象。 我们按值按降序对数据集进行排序,以将最频繁的连接放在表的顶部。 这确保我们在限制与num_records的连接时选择最重要的记录来绘制:

 dataset <- data.table(from = dataset[[1]] ,to = dataset[[2]] ,value = dataset[[3]] ,col_sentiment = dataset[[4]] ,col_type = dataset[[5]] ,from_name = dataset[[6]] ,to_name = dataset[[7]] ,from_avatar = dataset[[8]] ,to_avatar = dataset[[9]])[ order(-value)][ seq(1, min(nrow(dataset), limit_connection))]

接下来,我们必须通过为每个用户创建和分配唯一的用户 ID ( uid ) 来准备我们的用户信息,并将它们存储在一个新表中。 我们还计算用户总数并将该信息存储在一个名为num_nodes的单独变量中:

 user_ids <- data.table(id = unique(c(dataset$from, dataset$to)))[, uid := 1:.N] num_nodes <- nrow(user_ids)

让我们使用其他属性更新我们的用户信息,包括:

  • 追随者的数量(节点的大小)。
  • 记录数。
  • 用户类型(颜色代码)。
  • 头像链接。

我们将使用 R 的merge函数来更新表:

 user_ids <- merge(user_ids, dataset[, .(num_follower = uniqueN(to)), from], by.x = 'id', by.y = 'from', all.x = T)[is.na(num_follower), num_follower := 0][, size := num_follower][num_follower > 0, size := size + 50][, size := size + 10] user_ids <- merge(user_ids, dataset[, .(sum_val = sum(value)), .(to, col_type)][order(-sum_val)][, id := 1:.N, to][id == 1, .(to, col_type)], by.x = 'id', by.y = 'to', all.x = T) user_ids[id %in% dataset$from, col_type := '#42f548'] user_ids <- merge(user_ids, unique(rbind(dataset[, .('id' = from, 'Name' = from_name, 'avatar' = from_avatar)], dataset[, .('id' = to, 'Name' = to_name, 'avatar' = to_avatar)])), by = 'id')

我们还将我们创建的uid添加到原始数据集,以便稍后在代码中检索fromto用户 ID:

 dataset <- merge(dataset, user_ids[, .(id, uid)], by.x = "from", by.y = "id") dataset <- merge(dataset, user_ids[, .(id, uid_retweet = uid)], by.x = "to", by.y = "id") user_ids <- user_ids[order(uid)]

接下来,我们为可视化创建节点和边数据框。 我们选择节点的styleshape (实心圆圈),并选择user_ids表的正确列来填充节点的colordatavalueimage属性:

 nodes <- create_node_df(n = num_nodes, type = "lower",, color = user_ids$col_type, shape = 'circularImage', data = user_ids$uid, value = user_ids$size, image = user_ids$avatar, title = paste0("<p>Name: <b>", user_ids$Name,"</b><br>", "Super UID <b>", user_ids$id, "</b><br>", "# followers <b>", user_ids$num_follower, "</b><br>", "</p>") )

同样,我们选择与我们的边的fromtocolor属性相对应的dataset表列:

 edges <- create_edge_df(from = dataset$uid, to = dataset$uid_retweet, arrows = "to", color = dataset$col_sentiment)

最后,准备好节点和边数据框,让我们使用visNetwork库创建可视化并将其存储在默认代码稍后将使用的变量中,称为p

 p <- visNetwork(nodes, edges) %>% visOptions(highlightNearest = list(enabled = TRUE, degree = 1, hover = T)) %>% visPhysics(stabilization = list(enabled = FALSE, iterations = 10), adaptiveTimestep = TRUE, barnesHut = list(avoidOverlap = 0.2, damping = 0.15, gravitationalConstant = -5000))

在这里,我们在 visOptions 和 visPhysics 中自定义了一些网络可视化配置。 随意浏览文档页面并根据需要更新这些选项。 我们的Actual code部分现已完成,我们应该通过删除行来更新Create and save widget部分p = ggplotly(g); 因为我们编写了自己的可视化变量p

步骤 3:为 Power BI 准备可视化

现在我们已经完成了 R 中的编码,我们必须对支持的 JSON 文件进行某些更改,以准备在 Power BI 中使用的可视化。

让我们从capabilities.json文件开始。 它包括您在视觉效果选项卡中看到的大部分信息,例如我们的扩展程序的数据源和其他设置。 首先,我们需要更新dataRoles并将现有值替换为datasetnum_records输入的新数据角色:

 # ... "dataRoles": [ { "displayName": "dataset", "description": "Connection Details - From, To, # of Connections, Sentiment Color, To Node Type Color", "kind": "GroupingOrMeasure", "name": "dataset" }, { "displayName": "num_records", "description": "number of records to keep", "kind": "Measure", "name": "num_records" } ], # ...

在我们的capabilities.json文件中,我们还要更新dataViewMappings部分。 我们将添加我们的输入必须遵守的conditions ,并更新scriptResult以匹配我们的新数据角色及其条件。 有关更改,请参阅conditions部分以及scriptResult下的select部分:

 # ... "dataViewMappings": [ { "conditions": [ { "dataset": { "max": 20 }, "num_records": { "max": 1 } } ], "scriptResult": { "dataInput": { "table": { "rows": { "select": [ { "for": { "in": "dataset" } }, { "for": { "in": "num_records" } } ], "dataReductionAlgorithm": { "top": {} } } } }, # ...

让我们继续我们的dependencies.json文件。 在这里,我们将在cranPackages下添加三个额外的包,以便 Power BI 可以识别并安装所需的库:

 { "name": "data.table", "displayName": "data.table", "url": "https://cran.r-project.org/web/packages/data.table/index.html" }, { "name": "DiagrammeR", "displayName": "DiagrammeR", "url": "https://cran.r-project.org/web/packages/DiagrammeR/index.html" }, { "name": "visNetwork", "displayName": "visNetwork", "url": "https://cran.r-project.org/web/packages/visNetwork/index.html" },

注意:Power BI 应该会自动安装这些库,但如果遇到库错误,请尝试运行以下命令:

 install.packages(c("DiagrammeR", "htmlwidgets", "visNetwork", "data.table", "xml2"))

最后,让我们将视觉对象的相关信息添加到pbiviz.json文件中。 我建议更新以下字段:

  • 视觉对象的描述字段
  • 视觉对象的支持 URL
  • 视觉对象的 GitHub URL
  • 作者姓名
  • 作者的电子邮件

现在,我们的文件已经更新,我们必须从命令行重新打包可视化:

 pbiviz package

成功执行代码后,应在dist目录中创建一个.pbiviz文件。 可以在 GitHub 上查看本教程中涵盖的整个代码。

步骤 4:将可视化导入 Power BI

若要在 Power BI 中导入新的可视化,请打开 Power BI 报告(一份用于现有数据或在我们的先决条件步骤中使用测试数据创建的一份)并导航到“可视化”选项卡。 单击... [更多选项] 按钮并选择Import a visual from a file 。 注意:您可能需要先在浏览器中选择“编辑”才能看到“可视化”选项卡。

将出现一个窗格,其标题为“可视化”,右侧有两个“>”箭头。下面是文本“Build visual”,下面有两个图像:两个黄色矩形和一条线在左边,一张纸和画笔在右边。两个黄色矩形图像被选中,其下方有一个包含 30 多个不同图形图标的面板。最后一个图标是一个省略号,带有悬停文本“获取更多视觉效果”。在图标面板下方,文本“值”下方带有一行文本,内容为:“在此处添加数据字段”。在其下方,文本“Drill through”,然后是“Cross-report”,旁边选择了“Off”单选按钮。

导航到可视化文件夹的dist目录并选择.pbiviz文件以将您的可视化无缝加载到 Power BI。

步骤 5:在 Power BI 中创建可视化

您导入的可视化现在在可视化窗格中可用。 单击可视化图标将其添加到您的报告中,然后将相关列添加到datasetnum_records输入中:

将出现一个窗格,其中包含一个带有悬停文本“toptalSocialNetworkByBharatGarg”的选定工具图标。在图标下方,出现文本“数据集”,其下方有各种下拉矩形(从上到下):从用户、到用户、连接数、颜色、颜色、用户名、用户名、头像、头像。

您可以根据项目要求将其他文本、过滤器和功能添加到您的可视化中。 我还建议您阅读我们用来进一步增强可视化的三个 R 库的详细文档,因为我们的示例项目无法涵盖可用函数的所有用例。

升级您的下一个社交网络分析

我们的最终结果证明了 R 在创建自定义 Power BI 可视化时的强大功能和效率。 在您的下一个数据集上使用 R 中的自定义视觉效果尝试社交网络分析,并通过全面的数据洞察力做出更明智的决策。

Toptal 工程博客对 Leandro Roser 对本文中提供的代码示例的审阅表示感谢。

从上到下依次出现“Gold”(金色)、“Microsoft”和“Partner”(均为黑色)字样,后面是 Microsoft 徽标。
作为 Microsoft 金牌合作伙伴,Toptal 是您的 Microsoft 专家精英网络。 与您需要的专家一起建立高绩效团队 - 随时随地,在您需要的时候!