This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
##install.packages(“tidyverse”) install.packages(“igraph”) install.packages(“ggraph”)
# Load necessary libraries
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tibble' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'stringr' was built under R version 4.4.2
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(igraph)
## Warning: package 'igraph' was built under R version 4.4.3
##
## Attaching package: 'igraph'
##
## The following objects are masked from 'package:lubridate':
##
## %--%, union
##
## The following objects are masked from 'package:dplyr':
##
## as_data_frame, groups, union
##
## The following objects are masked from 'package:purrr':
##
## compose, simplify
##
## The following object is masked from 'package:tidyr':
##
## crossing
##
## The following object is masked from 'package:tibble':
##
## as_data_frame
##
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
##
## The following object is masked from 'package:base':
##
## union
library(ggraph)
## Warning: package 'ggraph' was built under R version 4.4.3
# Create a mock edge list: from - to relationships
edges <- tribble(
~from, ~to,
"Partner A", "Partner B",
"Partner A", "Partner C",
"Partner B", "Partner D",
"Partner C", "Partner D",
"Partner D", "Partner E",
"Partner E", "Partner F",
"Partner F", "Partner G",
"Partner G", "Partner H",
"Partner H", "Partner I",
"Partner A", "Partner J",
"Partner C", "Partner F",
"Partner B", "Partner H",
"Partner J", "Partner K",
"Partner K", "Partner L",
"Partner L", "Partner M",
"Partner M", "Partner N",
"Partner N", "Partner O",
"Partner O", "Partner P",
"Partner P", "Partner Q"
)
# Create graph object
g <- graph_from_data_frame(edges, directed = FALSE)
# Plot the network using ggraph
ggraph(g, layout = 'fr') +
geom_edge_link(alpha = 0.6, color = "gray") +
geom_node_point(size = 5, color = "skyblue") +
geom_node_text(aes(label = name), repel = TRUE, size = 4) +
theme_void() +
ggtitle("Mock Network of Partners")
# Calculate degree (number of connections)
V(g)$degree <- degree(g)
# View top connected partners
sort(V(g)$degree, decreasing = TRUE)
## [1] 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1
# Calculate betweenness centrality
V(g)$betweenness <- betweenness(g)
# View top brokers in the network
sort(V(g)$betweenness, decreasing = TRUE)
## [1] 65.416667 63.000000 60.000000 55.000000 48.000000 39.000000 34.666667
## [8] 28.000000 25.333333 21.083333 15.000000 12.333333 10.166667 3.916667
## [15] 1.083333 0.000000 0.000000
# Calculate closeness centrality
V(g)$closeness <- closeness(g)
# View most central partners by proximity
sort(V(g)$closeness, decreasing = TRUE)
## [1] 0.018867925 0.018518519 0.017543860 0.017241379 0.016666667 0.016129032
## [7] 0.014925373 0.014925373 0.014925373 0.014492754 0.013157895 0.012820513
## [13] 0.012820513 0.012195122 0.011235955 0.009803922 0.008547009
# Plot with node size based on degree
ggraph(g, layout = 'fr') +
geom_edge_link(alpha = 0.4, color = "gray") +
geom_node_point(aes(size = degree), color = "steelblue") +
geom_node_text(aes(label = name), repel = TRUE, size = 3) +
scale_size_continuous(range = c(3, 10)) +
theme_void() +
ggtitle("Partner Network: Node Size by Degree")
# Detect communities using Louvain algorithm
communities <- cluster_louvain(g)
V(g)$community <- communities$membership
# Plot with color by community
ggraph(g, layout = 'fr') +
geom_edge_link(alpha = 0.5) +
geom_node_point(aes(color = as.factor(community)), size = 5) +
geom_node_text(aes(label = name), repel = TRUE, size = 3) +
theme_void() +
ggtitle("Partner Network: Colored by Community")
library(visNetwork)
## Warning: package 'visNetwork' was built under R version 4.4.3
# Create nodes and edges from igraph object
nodes <- data.frame(id = V(g)$name,
label = V(g)$name,
group = communities$membership,
value = V(g)$degree)
edges <- as_data_frame(g, what = "edges")
visNetwork(nodes, edges) %>%
visNodes(scaling = list(min = 10, max = 30)) %>%
visEdges(arrows = "to") %>%
visOptions(highlightNearest = TRUE,
nodesIdSelection = TRUE) %>%
visLayout(randomSeed = 123) %>%
visPhysics(stabilization = TRUE)