Você pode procurar nas palavras-chave / tags do site Cross Validated.
Ramos como uma rede
Uma maneira de fazer isso é plotá-lo como uma rede com base nos relacionamentos entre as palavras-chave (com que frequência coincidem no mesmo post).
Quando você usa esse script sql para obter os dados do site em (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Em seguida, você obtém uma lista de palavras-chave para todas as perguntas com pontuação 2 ou superior.
Você pode explorar essa lista plotando algo como o seguinte:
Atualização: o mesmo com cor (com base nos vetores próprios da matriz de relação) e sem a etiqueta de auto-estudo
Você poderia limpar esse gráfico um pouco mais (por exemplo, retire as tags que não se relacionam a conceitos estatísticos, como tags de software, no gráfico acima isso já foi feito para a tag 'r') e melhore a representação visual, mas acho que esta imagem acima já mostra um bom ponto 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)
)
Ramos hierárquicos
Acredito que esse tipo de gráfico de rede acima esteja relacionado a algumas das críticas a uma estrutura hierárquica puramente ramificada. Se você preferir, acho que você pode executar um cluster hierárquico para forçá-lo a uma estrutura hierárquica.
Abaixo está um exemplo desse modelo hierárquico. Ainda seria necessário encontrar nomes de grupos adequados para os vários clusters (mas, não acho que esse cluster hierárquico seja a boa direção, deixo em aberto).
A medida da distância para o agrupamento foi encontrada por tentativa e erro (fazendo ajustes até os clusters parecerem bons.
#####
##### 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