Podrías buscar en las palabras clave/ tags del sitio web de Cross Validated.
Las sucursales como red
Una forma de hacerlo es trazarlo como una red basada en las relaciones entre las palabras clave (la frecuencia con la que coinciden en el mismo post).
Cuando se utiliza este script sql para obtener los datos del sitio desde (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
A continuación, se obtiene una lista de palabras clave para todas las preguntas con una puntuación de 2 o superior.
Podrías explorar esa lista trazando algo como lo siguiente:
Actualización: lo mismo con el color (basado en los vectores propios de la matriz de relación) y sin la etiqueta de autoestudio
Se podría limpiar un poco más este gráfico (por ejemplo, eliminar las etiquetas que no se relacionan con conceptos estadísticos como las etiquetas de software, en el gráfico anterior esto ya se hace para la etiqueta "r") y mejorar la representación visual, pero supongo que esta imagen de arriba ya muestra un buen punto de partida.
Código R:
#the sql-script saved like an sql file
network <- read.csv("~/../Desktop/network.csv", stringsAsFactors = 0)
#it looks like this:
> network[1][1:5,]
[1] "<r><biostatistics><bioinformatics>"
[2] "<hypothesis-testing><nonlinear-regression><regression-coefficients>"
[3] "<aic>"
[4] "<regression><nonparametric><kernel-smoothing>"
[5] "<r><regression><experiment-design><simulation><random-generation>"
l <- length(network[,1])
nk <- 1
keywords <- c("<r>")
M <- matrix(0,1)
for (j in 1:l) { # loop all lines in the text file
s <- stringr::str_match_all(network[j,],"<.*?>") # extract keywords
m <- c(0)
for (is in s[[1]]) {
if (sum(keywords == is) == 0) { # check if there is a new keyword
keywords <- c(keywords,is) # add to the keywords table
nk<-nk+1
M <- cbind(M,rep(0,nk-1)) # expand the relation matrix with zero's
M <- rbind(M,rep(0,nk))
}
m <- c(m, which(keywords == is))
lm <- length(m)
if (lm>2) { # for keywords >2 add +1 to the relations
for (mi in m[-c(1,lm)]) {
M[mi,m[lm]] <- M[mi,m[lm]]+1
M[m[lm],mi] <- M[m[lm],mi]+1
}
}
}
}
#getting rid of < >
skeywords <- sub(c("<"),"",keywords)
skeywords <- sub(c(">"),"",skeywords)
# plotting connections
library(igraph)
library("visNetwork")
# reduces nodes and edges
Ms<-M[-1,-1] # -1,-1 elliminates the 'r' tag which offsets the graph
Ms[which(Ms<50)] <- 0
ww <- colSums(Ms)
el <- which(ww==0)
# convert to data object for VisNetwork function
g <- graph.adjacency(Ms[-el,-el], weighted=TRUE, mode = "undirected")
data <- toVisNetworkData(g)
# adjust some plotting parameters some
data$nodes['label'] <- skeywords[-1][-el]
data$nodes['title'] <- skeywords[-1][-el]
data$nodes['value'] <- colSums(Ms)[-el]
data$edges['width'] <- sqrt(data$edges['weight'])*1
data$nodes['font.size'] <- 20+log(ww[-el])*6
data$edges['color'] <- "#eeeeff"
#plot
visNetwork(nodes = data$nodes, edges = data$edges) %>%
visPhysics(solver = "forceAtlas2Based", stabilization = TRUE,
forceAtlas2Based = list(nodeDistance=70, springConstant = 0.04,
springLength = 50,
avoidOverlap =1)
)
Ramas jerárquicas
Creo que este tipo de gráficos de red mencionados anteriormente están relacionados con algunas de las críticas relativas a una estructura jerárquica puramente ramificada. Si se quiere, supongo que se podría realizar un agrupamiento jerárquico para forzarlo a una estructura jerárquica.
A continuación se muestra un ejemplo de este modelo jerárquico. Todavía habría que encontrar nombres de grupo adecuados para los distintos clusters (pero, no creo que esta agrupación jerárquica sea la buena dirección, así que lo dejo abierto).
La medida de distancia para la agrupación se ha encontrado por ensayo y error (haciendo ajustes hasta que los clusters parecen agradables.
#####
##### cluster
library(cluster)
Ms<-M[-1,-1]
Ms[which(Ms<50)] <- 0
ww <- colSums(Ms)
el <- which(ww==0)
Ms<-M[-1,-1]
R <- (keycount[-1]^-1) %*% t(keycount[-1]^-1)
Ms <- log(Ms*R+0.00000001)
Mc <- Ms[-el,-el]
colnames(Mc) <- skeywords[-1][-el]
cmod <- agnes(-Mc, diss = TRUE)
plot(as.hclust(cmod), cex = 0.65, hang=-1, xlab = "", ylab ="")