Puede consultar las palabras clave / etiquetas del sitio web Cross Validated.
Ramas como una red
Una forma de hacerlo es trazarlo como una red basada en las relaciones entre las palabras clave (con qué frecuencia coinciden en la misma publicación).
Cuando utiliza este script SQL para obtener los datos del sitio de (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Luego, obtiene una lista de palabras clave para todas las preguntas con una puntuación de 2 o más.
Puede explorar esa lista trazando algo como lo siguiente:
Actualización: lo mismo con el color (basado en vectores propios de la matriz de relación) y sin la etiqueta de autoestudio
Puede limpiar este gráfico un poco más (por ejemplo, retire las etiquetas que no se relacionan con conceptos estadísticos como las etiquetas de software, en el gráfico anterior esto ya está hecho para la etiqueta 'r') y mejore 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 anteriores se relacionan con algunas de las críticas con respecto a una estructura jerárquica puramente ramificada. Si lo desea, supongo que podría realizar un agrupamiento jerárquico para forzarlo a una estructura jerárquica.
A continuación se muestra un ejemplo de dicho modelo jerárquico. Todavía sería necesario encontrar nombres de grupo adecuados para los diversos grupos (pero no creo que este grupo jerárquico sea la buena dirección, por lo que lo dejo abierto).
La medida de distancia para el agrupamiento se ha encontrado por prueba y error (haciendo ajustes hasta que los grupos parezcan 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 ="")
Escrito por StackExchangeStrike