Sie können sich die Keywords / Tags der Cross Validated-Website ansehen .
Filialen als Netzwerk
Eine Möglichkeit, dies zu tun, besteht darin, es als Netzwerk darzustellen, das auf den Beziehungen zwischen den Keywords basiert (wie oft sie im selben Beitrag übereinstimmen).
Wenn Sie dieses SQL-Skript verwenden, um die Daten der Site abzurufen (data.stackexchange.com/stats/query/edit/1122036)
select Tags from Posts where PostTypeId = 1 and Score >2
Anschließend erhalten Sie eine Liste mit Stichwörtern für alle Fragen mit einer Punktzahl von 2 oder höher.
Sie können diese Liste untersuchen, indem Sie Folgendes zeichnen:
Update: das gleiche mit Farbe (basierend auf Eigenvektoren der Relationsmatrix) und ohne das Selbststudien-Tag
Sie könnten diesen Graphen etwas weiter aufräumen (z. B. die Tags entfernen, die sich nicht auf statistische Konzepte beziehen, wie z. B. Software-Tags, im obigen Graphen ist dies bereits für den Tag 'r' der Fall) und die visuelle Darstellung verbessern, aber ich vermute dass dieses bild oben schon einen schönen ausgangspunkt zeigt.
R-Code:
#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)
)
Hierarchische Zweige
Ich glaube, dass diese Art von Netzwerkgraphen auf einige der Kritikpunkte in Bezug auf eine rein verzweigte hierarchische Struktur zurückzuführen ist. Wenn Sie möchten, können Sie vermutlich ein hierarchisches Clustering durchführen, um eine hierarchische Struktur zu erzwingen.
Nachfolgend finden Sie ein Beispiel für ein solches hierarchisches Modell. Man müsste immer noch die richtigen Gruppennamen für die verschiedenen Cluster finden (aber ich glaube nicht, dass diese hierarchische Gruppierung die richtige Richtung ist, also lasse ich sie offen).
Das Abstandsmaß für das Clustering wurde durch Ausprobieren ermittelt (Anpassungen vornehmen, bis die Cluster schön aussehen).
#####
##### 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 ="")
Geschrieben von StackExchangeStrike