Możesz zajrzeć do słów kluczowych / tagów witryny Cross Validated.
Oddziały jako sieć
Jednym ze sposobów na to jest wykreślenie go jako sieci opartej na relacjach między słowami kluczowymi (jak często pokrywają się w tym samym poście).
Gdy używasz tego skryptu sql, aby pobrać dane witryny z (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Następnie otrzymujesz listę słów kluczowych dla wszystkich pytań z wynikiem 2 lub wyższym.
Możesz przeglądać tę listę, wykreślając coś takiego:
Aktualizacja: to samo z kolorem (w oparciu o wektory własne macierzy relacji) i bez znacznika samokształcenia
Możesz wyczyścić ten wykres nieco dalej (np. Usunąć tagi, które nie odnoszą się do pojęć statystycznych, takich jak tagi oprogramowania, na powyższym wykresie jest to już zrobione dla tagu „r”) i poprawić reprezentację wizualną, ale myślę, że że powyższy obraz pokazuje już dobry punkt wyjścia.
Kod 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)
)
Hierarchiczne gałęzie
Uważam, że powyższe wykresy sieciowe odnoszą się do niektórych uwag dotyczących czysto rozgałęzionej struktury hierarchicznej. Jeśli chcesz, myślę, że możesz wykonać hierarchiczne grupowanie, aby zmusić go do hierarchicznej struktury.
Poniżej znajduje się przykład takiego modelu hierarchicznego. Nadal należałoby znaleźć odpowiednie nazwy grup dla różnych klastrów (ale nie sądzę, że ten hierarchiczny klaster jest dobrym kierunkiem, dlatego pozostawiam go otwartym).
Miara odległości dla grupowania została ustalona metodą prób i błędów (wprowadzanie korekt, aż klastry będą wyglądać ładnie).
#####
##### 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 ="")
Napisane przez StackExchangeStrike