使用 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 對本文中提供的代碼示例的審閱表示感謝。