使用 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 專家精英網絡。 與您需要的專家一起建立高績效團隊 - 隨時隨地,在您需要的時候!