使用 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) 边缘属性
- 颜色、笔划或箭头连接:表示连接的类型,例如,连接两个用户的帖子或推文的情绪
- 宽度:表示连接强度,例如,在给定时间段内两个用户之间观察到多少次提及或转发
让我们检查一个示例社交网络视觉对象,以了解这些属性如何发挥作用:
我们还可以使用悬停文本来补充或替换上述参数,因为它可以支持其他无法通过节点或边属性轻松表达的信息。
比较 Power BI 的社交网络扩展
在定义了社交网络的不同数据特征之后,让我们来看看用于在 Power BI 中可视化网络的四种流行工具的优缺点。
扩大 | Arthur Graus 的社交网络图 | 网络导航器 | ZoomCharts 的高级网络(轻量版) | 使用 R 自定义可视化 |
---|---|---|---|---|
动态节点大小 | 是的 | 是的 | 是的 | 是的 |
动态边缘尺寸 | 不 | 是的 | 不 | 是的 |
节点颜色定制 | 是的 | 是的 | 不 | 是的 |
复杂的社交网络处理 | 不 | 是的 | 是的 | 是的 |
节点的配置文件图像 | 是的 | 不 | 不 | 是的 |
可调变焦 | 不 | 是的 | 是的 | 是的 |
前 N 个连接过滤 | 不 | 不 | 不 | 是的 |
悬停的自定义信息 | 不 | 不 | 不 | 是的 |
边缘颜色定制 | 不 | 不 | 不 | 是的 |
其他高级功能 | 不 | 不 | 不 | 是的 |
Arthur Graus 的 Social Network Graph、Network Navigator 和 ZoomCharts 的 Advanced Networks(轻量版)都是适合开发简单社交网络并开始您的第一个社交网络分析的扩展。
但是,如果您想通过引人注目的视觉效果让您的数据变得生动并发现突破性的见解,或者如果您的社交网络特别复杂,我建议您在 R 中开发您的自定义视觉效果。
这个自定义可视化是我们教程在 R 中的社交网络扩展的最终结果,并展示了 R 提供的大量特征和节点/边缘属性。
使用 R 为 Power BI 构建社交网络扩展
使用 R 创建扩展以在 Power BI 中可视化社交网络包括五个不同的步骤。 但在我们构建社交网络扩展之前,我们必须将数据加载到 Power BI 中。
先决条件:为 Power BI 收集和准备数据
您可以使用基于 Twitter 和 Facebook 数据的测试数据集来学习本教程,或者继续使用您自己的社交网络。 我们的数据是随机的; 如果需要,您可以下载真实的 Twitter 数据。 收集所需数据后,将其添加到 Power BI(例如,通过导入 Excel 工作簿或手动添加数据)。 您的结果应类似于下表:
设置好数据后,您就可以创建自定义可视化了。
第 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
脚本。
成功执行代码后,您将看到一个具有以下结构的文件夹:
一旦我们准备好文件夹结构,我们就可以为我们的自定义可视化编写 R 代码。
第 2 步:在 R 中编写可视化代码
第一步创建的目录包含一个名为script.r
的文件,其中包含默认代码。 (默认代码创建一个简单的 Power BI 扩展,它使用 R 中可用的iris
示例数据库按Petal.Species
绘制Petal.Length
的直方图。)我们将更新代码但保留其默认结构,包括其注释部分。
我们的项目使用三个 R 库:
- DiagrammeR:从文本创建图形
- visNetwork:提供交互式网络可视化
- data.table:协助数据组织,类似于 data.frame
让我们替换script.r
的Library 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
添加到原始数据集,以便稍后在代码中检索from
和to
用户 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)]
接下来,我们为可视化创建节点和边数据框。 我们选择节点的style
和shape
(实心圆圈),并选择user_ids
表的正确列来填充节点的color
、 data
、 value
和image
属性:
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>") )
同样,我们选择与我们的边的from
、 to
和color
属性相对应的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
并将现有值替换为dataset
和num_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 。 注意:您可能需要先在浏览器中选择“编辑”才能看到“可视化”选项卡。
导航到可视化文件夹的dist
目录并选择.pbiviz
文件以将您的可视化无缝加载到 Power BI。
步骤 5:在 Power BI 中创建可视化
您导入的可视化现在在可视化窗格中可用。 单击可视化图标将其添加到您的报告中,然后将相关列添加到dataset
和num_records
输入中:
您可以根据项目要求将其他文本、过滤器和功能添加到您的可视化中。 我还建议您阅读我们用来进一步增强可视化的三个 R 库的详细文档,因为我们的示例项目无法涵盖可用函数的所有用例。
升级您的下一个社交网络分析
我们的最终结果证明了 R 在创建自定义 Power BI 可视化时的强大功能和效率。 在您的下一个数据集上使用 R 中的自定义视觉效果尝试社交网络分析,并通过全面的数据洞察力做出更明智的决策。
Toptal 工程博客对 Leandro Roser 对本文中提供的代码示例的审阅表示感谢。