Desarrollo de grafos aplicados en proyectos de Organizational Network Analysis.
pacman::p_load(tidyverse, onadata, visNetwork, igraph, networkD3)
El dataset Vamos a trabajar con un dataset armado con los contactos de LinkedIn de Inés Murtagh, Sofía Weintraub y Josefina Soto Acebal.
# Carga de datos
contactos <- read_delim("/Users/inesmurtagh/Downloads/Connections.csv", delim = ";")
glimpse(contactos)
## Rows: 1,088
## Columns: 7
## $ Origen <chr> "Sofia Weintraub", "Sofia Weintraub", "Sofia Weintraub"…
## $ Contact <chr> "Katerina Postel", "Tomás Falaq", "Martin Hadid", "Tomá…
## $ URL <chr> "https://www.linkedin.com/in/katerina-postel-a21aa5199"…
## $ Company <chr> "Accenture", "Natura &Co", "Google", "Growketing", "Ste…
## $ Position <chr> "Procurement Operations Senior Analyst", "Becario de fi…
## $ `Connected On` <chr> "16 Apr 2024", "16 Apr 2024", "15 Apr 2024", "15 Apr 20…
## $ ...7 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
Nos quedamos con los datos de aquellos contactos que trabajan en algun area relacionada con Datos.
# Filtrar donde la posición diga "Data Scientist", "Data Analyst" o "Data Analytics"
keywords <- c('data', 'datos', 'CDO')
datos <- contactos %>% filter(str_detect(Position, regex(paste(keywords, collapse="|"), ignore_case=TRUE, perl=TRUE)))
glimpse(datos)
## Rows: 101
## Columns: 7
## $ Origen <chr> "Sofia Weintraub", "Sofia Weintraub", "Sofia Weintraub"…
## $ Contact <chr> "Tomás Zanchetti", "Tomás Said", "Pablo Castro", "Ramón…
## $ URL <chr> "https://www.linkedin.com/in/tomas-zanchetti", "https:/…
## $ Company <chr> "Growketing", "KimotionStudio", "Novakorp", "Ripley Chi…
## $ Position <chr> "Head of Data & Technology", "Consultor Data Science", …
## $ `Connected On` <chr> "15 Apr 2024", "09 Apr 2024", "04 Apr 2024", "28-mar-24…
## $ ...7 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
# Identificamos los datos únicos de origen
origen <- datos %>% distinct(Origen) %>% rename(label=Origen)
# Identificamos los datos únicos de contacto
contacto <- datos %>% distinct(Contact) %>% rename(label=Contact)
# Unificamos los dos dataframes
nodes <- full_join(origen, contacto, by = "label")
# Añadimos una columna de ID
nodes <- nodes %>% rowid_to_column("id")
nodes
## # A tibble: 77 × 2
## id label
## <int> <chr>
## 1 1 Sofia Weintraub
## 2 2 Ines Murtagh
## 3 3 Josefina Soto Acebal
## 4 4 Tomás Zanchetti
## 5 5 Tomás Said
## 6 6 Pablo Castro
## 7 7 Ramón Murias Palomer
## 8 8 Santiago Ruffini
## 9 9 Sebastian Kleiner
## 10 10 Pablo Gomez
## # ℹ 67 more rows
# Calculamos la cantidad de conexiones entre Origen y Contacto
conexion <- datos %>%
group_by(Origen, Contact) %>%
summarise(peso = n()) %>%
ungroup()
# Indico a las aristas cuál es el nodo de origen y cuál el de destino
aristas <- conexion %>%
left_join(nodes, by = c("Origen" = "label")) %>%
rename(from = id)
aristas <- aristas %>%
left_join(nodes, by = c("Contact" = "label")) %>%
rename(to = id)
# Ver el dataset
aristas
## # A tibble: 101 × 5
## Origen Contact peso from to
## <chr> <chr> <int> <int> <int>
## 1 Ines Murtagh AGUSTIN LARA ACOSTA 1 2 40
## 2 Ines Murtagh Abril Noguera 1 2 60
## 3 Ines Murtagh Azul de los Ángeles Makk 1 2 65
## 4 Ines Murtagh Bruno Soifer 1 2 49
## 5 Ines Murtagh Camila Collado 1 2 42
## 6 Ines Murtagh Camila Pettinato 1 2 41
## 7 Ines Murtagh Delfina Fiorellino 1 2 67
## 8 Ines Murtagh Ezequiel Eliano Sombory 1 2 59
## 9 Ines Murtagh Ezequiel Shinzato 1 2 66
## 10 Ines Murtagh Francisca Sulzberger 1 2 64
## # ℹ 91 more rows
# Seleccionamos algunas columnas
aristas <- select(aristas, from, to, peso)
edges <- mutate(aristas, width = peso/5 + 1)
nodes$color <- c(rep("#DD6B06", 3), rep("#2CAFBB", 74))
# Visualizar el grafo
referidos <- visNetwork(nodes, aristas) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visNodes(color = list(background = "#5DBAC3",
border = "#01636D")) %>%
visEdges(color = list(color = "grey", highlight = "#014D54" )) %>%
visOptions(highlightNearest = TRUE)
# visSave(referidos, file = "referidos.html")
referidos
Otro paquete:
# Otra alternativa
nodes_d3 <- mutate(nodes, id = id - 1)
edges_d3 <- mutate(aristas, from = from - 1, to = to - 1)
forceNetwork(Links = edges_d3, Nodes = nodes_d3, Source = "from", Target = "to",
NodeID = "label", Group = "color", Value = "peso",
opacity = 1, fontSize = 16, zoom = TRUE)